我有以下问题。我的客户端程序监视本地网络中服务器的可用性(使用 Bonjour,但它不支持 mater)。一旦服务器被客户端应用程序“注意到”,客户端就会尝试创建套接字:Socket(serverIP,serverPort);
。
在某些时候,客户端可能会丢失服务器(Bonjour 说服务器在网络中不再可见)。因此,客户端决定关闭
套接字,因为它不再有效。
某时服务器再次出现。因此,客户端尝试创建一个与该服务器关联的新套接字。但!服务器可以拒绝创建此套接字,因为它(服务器)已经有一个与客户端 IP 和客户端端口关联的套接字。发生这种情况是因为套接字是由客户端而不是服务器关闭的。它会发生吗?如果是这样,如何解决这个问题?
好吧,我知道客户端不太可能尝试从同一端口(客户端端口)连接到服务器,因为客户端会随机选择其端口。但它仍然可能发生(只是偶然)。对吧?
最佳答案
是的,一旦检测到故障就关闭套接字。
如果没有正确关闭,套接字将“卡住”在“close_wait”中。 即使套接字关闭,它的状态也会在 time_wait 中停留一小段时间。
但是,如果您将应用程序设计为对每个新连接使用不同的本地端口,则无需等待旧套接字关闭。
(当您创建一个完全不同的套接字时,因为套接字由远程 ip、远程端口、本地 ip 和本地端口标识。)
关于java - 我应该从两端关闭套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454550/