我想写一个套接字程序......
Socket socket = new Socket("127.0.0.1",12345);
DataOutputStream output = new DataOutputStream( socket.getOutputStream() );
output.writeUTF("Hello");
output.writeUTF("World");
...
...
“你好”,“世界”......首先到达哪个字符串? 套接字是否保证订单?
答案 0 :(得分:6)
TCP协议保证所有消息都完全按顺序发送。所以你可以依靠“世界”总是在“你好”之后到达的前提。如果由于某种原因“Hello”数据包丢失,则“World”数据包到另一个应用程序的传递将被延迟,而“Hello”数据包将再次被重新请求。
这由所涉及主机的操作系统的网络堆栈自动处理 - 您不必为应用程序编程人员做任何事情。
有关TCP协议如何工作的更多信息,我可以向您推荐the wikipedia article about it。
另一方面,当您使用UDP套接字时,情况会有所不同。 UDP不保证顺序或可靠性,因此有可能一个数据包超过另一个数据包(因此用户在“Hello”之前接收“World”),甚至一个数据包丢失(用户只接收“Hello”或只有“世界”)。
但是,标准Socket类默认使用TCP。通过将true
作为第三个参数(不推荐使用)传递,或者将自定义套接字实现传递给使用UDP的静态方法Socket.setSocketImplFactory,可以通过告诉它在构造函数中使用UDP来覆盖它。 (这将是疯狂的 - 这种方法的目的是实现既不是UDP也不是TCP的外来传输层协议。)
通常,UDP套接字由类DatagramSocket表示。