我目前正在开发一个简单的多人游戏,其中服务器客户端需要连接到服务器。
我的服务器由单个serverSocket组成。此serverSocket接受传入的连接,并将它们移交给启动单独线程的连接对象。
ServerSocket seso = new ServerSocket(12345);
while(true){
Socket toClient = seso.accept();
new Connection(toClient); //creates a thread that opens streams etc
}
客户端打开一个新的套接字并连接到该服务器。
Socket toServer = new Socket();
toServer.setReuseAddress(true);
toServer.bind(new InetSocketAddress(65432)); //always using the same port
toServer.connect(new InetSocketAddress(serverIP,12345));
现在,如果我使用断开与服务器的连接,toServer.close();
然后尝试再次连接至服务器,则会收到“地址已在使用中:连接”异常。
使用TCPView,我可以看到客户端procress的状态更改为TIME_WAIT。但是由于这个原因,我不应该再次使用该端口setReuseAddress(true)
吗?我使用的是错误的还是服务器问题?
我总是在toClient和toServer上调用.close()。但是,我总是必须等到套接字完全关闭(在TIME_WAIT之后),此客户端才能再次连接到服务器。
当我关闭整个应用程序时,套接字立即关闭(不在TIME_WAIT状态),此客户端可以连接到我的服务器。(并且ofc服务器中有一个连接重置异常)
在不总是关闭应用程序的情况下该怎么做?
谢谢你的帮助。
为了进一步说明我的观点,客户端/服务器协议要求服务器侦听客户端已知或可发现的端口(可以视为“服务器”的定义),但通常不要求客户端从一个特定的端口。如果未将客户端套接字绑定到特定端口,则基础系统将自动透明地选择可用的(源)端口。
如果服务器由于某种原因依赖于从特定端口连接的客户端,则应重新评估设计的这一方面。如果不是这样,那么让客户端以这种方式连接就给自己制造了麻烦。这应该是您需要做的所有事情:
Socket toServer = new Socket();
toServer.connect(new InetSocketAddress(serverIP, 12345));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句