2013-03-18 73 views
4

我想编写一个套接字程序...Java的插座消息到达顺序

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

“你好”,“世界” ......这串会首先来了吗? 套接字是否保证顺序?

+6

如果它是一个TCP套接字,是的,它是有保证的。但对于数据报(UDP)套接字不是。 – deepmax 2013-03-18 15:57:45

+1

@MM。你应该添加它作为答案 – Joshua 2013-03-18 16:06:56

回答

6

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

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

有关TCP协议如何工作的更多信息,我可以推荐你the wikipedia article about it

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

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

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