我目前正在开发一个简单的多人游戏,其中有几个客户需要连接到服务器 .
我的服务器由一个serverSocket组成 . 此serverSocket接受传入连接并将其交给启动单独线程的连接对象 .
ServerSocket seso = new ServerSocket(12345);
while(true){
Socket toClient = seso.accept();
new Connection(toClient); //creates a thread that opens streams etc
}
客户端打开一个新的Socket并连接到此服务器 .
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(); 关闭与服务器的连接并尝试再次连接到服务器,我会收到"address already in use: connect"异常 .
使用TCPView我可以看到客户端procress的状态更改为TIME_WAIT . 但是,由于 setReuseAddress(true) ,我不应该再次使用此端口吗?我使用它错了还是服务器问题?
我总是在toClient和toServer上调用.close() . 然而,我总是要等到套接字完全关闭(在TIME_WAIT之后),然后该客户端才能再次连接到服务器 .
当我关闭整个应用程序时,套接字立即关闭(不在状态TIME_WAIT),此客户端可以连接到我的服务器 . (并且我的服务器中存在连接重置异常)
如果不关闭应用程序,我怎么能这样做?
谢谢你的帮助 .