Java套接字消息到达顺序

蔣彥亭*_*蔣彥亭 4 java sockets

我想写一个套接字程序......

Socket socket = new Socket("127.0.0.1",12345);
DataOutputStream output = new DataOutputStream( socket.getOutputStream() );
output.writeUTF("Hello");
output.writeUTF("World");
 ...
 ...
Run Code Online (Sandbox Code Playgroud)

"你好","世界"......首先到达哪个字符串?套接字是否保证订单?

Phi*_*ipp 6

TCP协议保证所有消息都完全按顺序发送.所以你可以依靠"世界"总是在"你好"之后到达的前提.如果"Hello"数据包由于某种原因而丢失,则"World"数据包到另一个应用程序的传递将被延迟,而"Hello"数据包将再次被重新请求.

这由所涉及主机的操作系统的网络堆栈自动处理 - 您不必为应用程序员做任何事情.

有关TCP协议如何工作的更多信息,我可以向您推荐有关它的维基百科文章.

另一方面,当您使用UDP套接字时,情况会有所不同.UDP不保证顺序或可靠性,因此有可能一个数据包超过另一个数据包(因此用户在"Hello"之前接收"World"),甚至一个数据包丢失(用户只接收"Hello"或只有"世界").

但是,标准Socket类默认使用TCP.这可以通过告诉它在构造函数中使用UDP true作为第三个参数(不推荐使用),或者将自定义套接字实现传递给使用UDP 的静态方法Socket.setSocketImplFactory(这将是疯狂的 -该方法的目的是实现既不是UDP也不是TCP的外来传输层协议.

通常,UDP套接字由类DatagramSocket表示.