4

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

Socket socket = new Socket("127.0.0.1",12345);
DataOutputStream output = new DataOutputStream( socket.getOutputStream() );
output.writeUTF("Hello");
output.writeUTF("World");
 ...
 ...

“Hello”、“World”……哪个字符串先到达?socket有保证订单吗?

4

1 回答 1

8

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

这是由相关主机的操作系统的网络堆栈自动处理的——作为应用程序程序员,您无需为此做任何事情。

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

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

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

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

于 2013-03-18T16:08:41.687 回答