我已经在同一台计算机上实现了局域网游戏和测试:创建一个类,在这个类的不同线程中创建一个服务器和一个客户端并连接在一起。
关闭两个窗口(客户端和服务器)后,我再次执行上述步骤:运行java类,创建服务器和客户端。我总是遇到这个错误:java.net.BindException
(因为此端口之前已经创建并且尚未关闭)。
每次我创建服务器套接字时,在catch中,我总是放serverSocket.close()
。但这个错误仍然遇到了我。请给我一些想法来防止这种情况。
@:如果我们知道已经创建了一个端口,我们可以关闭它并创建新端口吗?
谢谢:)
答案 0 :(得分:2)
你应该把serverSocket.close()放在你的finally块中,也许等几秒钟再试一次绑定到那个地址。
答案 1 :(得分:2)
除非捕获到异常,否则不会运行任何放入catch块的内容。相反,将close()
调用放在finally块中以确保它始终运行。
答案 2 :(得分:0)
在频道上调用close()
可能还不够。请参阅此处的说明:http://hea-www.harvard.edu/~fine/Tech/addrinuse.html
TCP连接可以保持CLOSE-WAIT或TIME-WAIT状态。
您可以重复使用地址(SO_REUSEADDR),但它对我不起作用。
最好是等待网络级别的CLOSE-WAIT或TIME-WAIT设置的超时。