在同一套接字上发送的不同消息是否总是以FIFO顺序从另一端接收?

我在任何地方都找不到这些信息,我知道TCP会对数据包进行重新排序,但它是否也适用于同一连接上的不同消息?

如果不是,在两个对等点之间保持FIFO顺序的网络通信的Java类是什么?

Edit:

正如一条 comments 所指出的,套接字中没有消息.我指的是以下的用法:

ObjectOutputStream writer = new ObjectOutputStream(socket.getOutputStream());
writer.writeObject(obj);

这些对象是否被批准以相同的顺序接收?

推荐答案

在同一套接字上发送的不同消息是否总是以FIFO顺序从另一端接收?

套接字不是消息流.抽象概念不支持这一概念.同样,TCP是用于发送字节序列的协议.

套接字以与发送方发送字节流相同的顺序将字节流传递给接收方.实现的tcp协议保证1数据不会重新排序.协议栈处理实际网络分组可能被无序地丢弃、重发和/或接收的事实.

(您可以设计和实现使用TCP作为其传输协议的基于消息的应用程序协议.例如,指定特定的字节值表示消息的开始和结束.应用程序级消息不会被TCP重新排序,因为表示它们的字节流不会重新排序.)

1-我应该对此进行限定.TCP/IPv4在每个网络数据包中使用校验和(16位CRC)来防止传输错误.然而,从理论上讲,分组可能以这样一种方式被 destruct ,即两个字节被转置并且CRC仍然有效."保证"忽略了这一点.


我指的是以下的用法:

ObjectOutputStream writer = 
        new ObjectOutputStream(socket.getOutputStream());
writer.writeObject(obj);

我们已经解释过,套接字保持字节的顺序.因此,如果上面的代码和匹配的接收代码中发生任何重新排序,那将是由于ObjectOutputStreamObjectInputStreamAPI中的某些东西造成的.

在javadoc或Java对象序列化规范中,我没有发现任何说明对象是以相同的顺序写入然后读取的内容.然而,这就是协议和API设计的工作方式,以及实现的实际行为.

是否保证以相同的顺序接收这些对象?

是.

您可以通过判断OpenJDK代码库中各个类的源代码来验证这一点.(任何版本.)

Java相关问答推荐

我可以从Java模块中排除maven资源文件夹吗?

为什么我的画布没有显示在PFA应用程序中?

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

springboot start loge change

JavaFX Maven Assembly插件一直打包到错误的JDK版本

RESTful框架类字段是安全的还是不安全的

无法在WebSocket onMessage中捕获错误

所有 case 一起输入时输出错误,而单独放置时输出正确

为什么在maven中,getLast方法不适用于List?

与Spring Boot相关的实体未正确保存

将响应转换为带值的键

将java.util.Date转换为OffsetDateTime

如何对多个字段进行分组和排序?

有没有更快的方法在N个容器中删除重复项?

来自外部模块的方面(对于Java+Gradle项目)不起作用

Java集合:NPE,即使没有添加空值

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

当我将鼠标悬停在javafxTextArea上时,如何更改鼠标光标?

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?