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

Posted

技术标签:

【中文标题】打开的套接字和连接的套接字有啥区别?【英文标题】:Whats the difference between a socket which is open and a socket which is connected?打开的套接字和连接的套接字有什么区别? 【发布时间】:2012-10-02 05:39:29 【问题描述】:

JavaSocket类有两个方法isClosedisConnected分别检查socket是关闭还是连接。我想知道只打开的 TCP 套接字和打开并连接的 TCP 套接字有什么区别,这与 UDP 有何不同。

【问题讨论】:

【参考方案1】:

简单地说,一个 openSocket 是一个正在等待连接或已与另一个Socket 成功连接的套接字。当一个套接字被关闭时,这意味着这个套接字不再可用于连接,并且它的资源已经被释放。一个Socket 即已连接,嗯,这意味着该套接字连接到另一个Socket

所以Socket 可以..

同时打开和连接。 同时打开且未连接。 关闭时无法连接。

更新

来自@Bryan

显然,TCP Socket 有 半关闭半打开 状态;哪个用法(今天)与它的原始含义不同。更多关于这个link。

【讨论】:

不要混淆,但 TCP 也有半关闭状态,仍然有连接,但现在是单向的。【参考方案2】:

此页面对套接字状态进行了很好的概述:http://diranieh.com/SOCKETS/SocketStates.htm 以及 TCP 和 UDP 套接字之间的区别。特别是:

状态“打开”(TCP 和 UDP):已创建未命名的套接字。未命名的套接字是未绑定到本地地址和端口的套接字 状态“已连接”(仅限 TCP):已在本地和远程主机之间建立关联(虚拟电路)。现在可以发送和接收数据了。

请注意,java.net.DatagramSocket 的较新实现支持对 TCP/IP 网络状态的扩展:DatagramSocket 也可以处于“已连接”状态,因此即使数据报,isConnected() 也不一定返回 false套接字永远不会在网络层“连接”。特别是:“当 DatagramSocket 连接到远程地址时,数据包只能发送到该地址或从该地址接收。默认情况下,不连接数据报套接字。”

有关详细信息,请参阅 sources 和 JavaDoc。

【讨论】:

以上是关于打开的套接字和连接的套接字有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Unix 套接字和 TCP/IP 套接字运行 PHP-FPM 有啥区别?

unix套接字中的异步和非阻塞有啥区别?

Web 套接字、长轮询、服务器发送事件和永久帧之间有啥区别?

有啥方法可以检查套接字连接是不是可用?

Docker:有啥方法可以列出正在运行的 docker 容器中打开的套接字?

struct addrinfo 和 struct sockaddr 有啥区别