Java Socket是否遵循FIFO?ObjectOutputStream写入对象顺序能否保证?
同一TCP Socket中ObjectOutputStream发送对象的顺序保证问题
首先明确核心结论:基于TCP的Socket通信,应用层拿到的字节流是严格遵循FIFO(先进先出)顺序的。
关于TCP重排序的说明
TCP协议栈确实会在网络传输中处理数据包乱序、重传的情况,但这些都是底层的透明操作——接收端的TCP栈会把乱序的数据包重新排序,再把完整有序的字节流交付给应用层,应用层完全感知不到这个过程。
针对ObjectOutputStream的场景
你用以下代码发送对象的场景:
ObjectOutputStream writer = new ObjectOutputStream(socket.getOutputStream()); writer.writeObject(obj1); writer.writeObject(obj2);
完全可以保证接收端用ObjectInputStream.readObject()时,obj1会先于obj2被读取并反序列化。原因是:
writeObject()会把对象序列化成连续的字节片段,依次写入TCP输出流;- 底层TCP保证这些字节片段会按发送顺序完整传递到接收端;
- 接收端的
ObjectInputStream会按字节流的顺序依次解析出对应的对象。
额外补充
- 所有基于TCP的Java网络通信类(比如
Socket、ServerSocket,以及基于它们封装的NIO组件如SocketChannel)都能保证字节流的FIFO顺序,只要是基于字节流的序列化/反序列化操作,都能保证消息(对象)的顺序。 - 只有UDP协议(对应Java中的
DatagramSocket)不保证数据包的顺序,因为UDP是无连接、不可靠的协议,不会处理数据包乱序和重传。
内容的提问来源于stack exchange,提问作者Tommimon
相关产品推荐
相关产品推荐

