打开的套接字和连接的套接字有什么区别?

11

Java中的Socket类有两个方法isClosedisConnected,分别用于检查套接字是否关闭或已连接。我想知道仅打开的TCP套接字与打开且连接的TCP套接字之间的区别,以及这与UDP有何不同。

2个回答

11
简单来说,一个“打开”的Socket是指一个正在等待连接或已经成功连接到另一个Socket的套接字。当一个套接字被“关闭”时,意味着这个套接字不再可用于连接,并且其资源已经被释放。而“连接”的Socket则表示该套接字已经与另一个Socket连接上了。
所以一个Socket可以:
  • 同时处于打开和连接状态。
  • 同时处于打开但未连接状态。
  • 关闭时未连接。
更新: 来自@Bryan的信息:
显然TCP套接字存在“半关闭”或“半打开”状态;这个状态今天的用法与它最初的含义有所不同。更多信息请参考此链接

1
不要混淆,但TCP也有一个半关闭状态,在这种状态下仍然存在连接,但现在是单向的。 - Brian White

7
本页提供了有关套接字状态的相当不错的概述:http://diranieh.com/SOCKETS/SocketStates.htm,以及TCP和UDP套接字之间的区别。具体地:
- "打开"状态(TCP和UDP):已创建未命名套接字。未命名套接字是指未绑定到本地地址和端口的套接字。 - "已连接"状态(仅TCP):在本地和远程主机之间建立了一个关联(虚拟电路)。现在可以发送和接收数据。
请注意,较新的java.net.DatagramSocket实现支持对TCP/IP网络状态的扩展:DatagramSocket也可以处于"连接"状态,因此isConnected()不一定会返回false,即使数据报套接字在网络层上从未被"连接"过。特别地:“当DatagramSocket连接到远程地址时,数据包只能发送到该地址或从该地址接收。默认情况下,数据报套接字未连接。 有关更多信息,请参见源代码JavaDoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接