当前位置: 首页 > 知识库问答 >
问题:

Java客户机服务器应用程序-地址已在使用:connect

聂昱
2023-03-14


我目前正在开发一个简单的多人游戏,服务器客户端需要连接到服务器。

我的服务器由一个服务器套接字组成。这个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关闭与服务器的连接。关闭() 并尝试再次连接到服务器,我得到一个“地址已在使用:连接”异常。

使用TCPView,我可以看到客户机的状态随着时间的推移而变化。但是,由于setReuseAddress(true),我不能再次使用这个端口吗?是我用错了还是服务器出了问题?

我总是在toClient和toServer上调用. clo()。尽管如此,我总是必须等到套接字完全关闭(在TIME_WAIT之后),然后这个客户端才能再次连接到服务器。

当我关闭整个应用程序时,套接字会立即关闭(不是处于TIME_WAIT状态),该客户端可以连接到我的服务器。(和ofc我的服务器中存在连接重置异常)

我如何在不关闭应用程序的情况下做到这一点<谢谢你的帮助。


共有1个答案

赏逸春
2023-03-14

为了扩展我的评论,客户机/服务器协议要求服务器监听客户机已知或可发现的端口——这可以被视为“服务器”的定义——但通常不要求客户机从特定端口连接。如果不将客户端套接字绑定到特定端口,则底层系统将自动透明地选择可用(源)端口。

如果服务器由于某种原因依赖于从特定端口连接的客户端,那么您应该重新评估设计的这一方面。如果没有,那么让客户端以这种方式连接就是在制造自己的麻烦。这应该是您需要做的全部:

Socket toServer = new Socket();
toServer.connect(new InetSocketAddress(serverIP, 12345));
 类似资料:
  • 我试图构建一个小型的对等消息传递应用程序,它使用Python中的基本客户机服务器系统。 对于客户端,我们使用:- 注:-我真的很困惑&一个新手。请帮帮我。

  • 我是编码和Java的新手,我已经创建了一个简单的客户端-服务器程序,客户端可以请求一个文件。它的内容将显示在浏览器页面中,还有一些细节,如数据类型和长度。我现在有一个问题,我不确定如何在浏览器中显示正确连接的服务器响应,如“HTTP/1.1 200 OK”和关闭的连接,如“Connection: close”。我有一个处理响应的方法,如下所示: 对我如何做到这一点有什么建议吗?非常感谢。

  • 我想在java上创建一个客户机/服务器应用程序,服务器的IP地址为192.168.1.100,在端口4500上等待客户机请求。 客户端从键盘上读取字符串,向服务器发送连接请求。一旦建立了连接,它就会将字符串发送到服务器。 这是我尝试的代码: 对于服务者: 对于客户端: 但这段代码有一个问题:

  • 问题内容: 我正在尝试以客户端/服务器方式制作Java应用程序。客户端是SWT中的GUI,它显示来自服务器的数据。服务器已连接到数据库。 好的,对此感到抱歉,我确定这是一个经典问题,但我不知道如何开始。 在我为他们工作的一个项目中,他们实施了很多魔术来透明地调用Glassfish服务器。 我不想使用Glassfish服务器。我只想要简单的Java语言。但是代理的概念似乎很酷。 你有这种想法或例子吗

  • 我正在使用TCP / IP流编写客户端服务器Java程序,我的服务器连接到oracle数据库。当客户端请求一些信息时,服务器处理查询,即返回一个包含一些行的列(例如 5)。我想将整列发送回客户端,我能够发送和接收单行数据,但不能发送和接收多行(因为表包含许多行 i,e 行)....任何帮助都是可取的