Java绑定异常 - TCP - 已在使用的地址:connect

时间:2017-02-28 19:24:08

标签: java sockets exception tcp

我知道已经有几个类似的问题,但我没有找到适合我案例的回复。 请考虑一个简单的客户端 - 服务器应用程序,我必须在其中建立TCP连接。

在服务器端,我通过代码等待TCP连接:

$(CC) -c -o $@ $< $(CFLAGS)

在客户端,我通过代码请求TCP连接:

ServerSocket mySS= new ServerSocket(10000);
Socket mySocket_ServerSide= mySS.accept();                

Everythink第一次工作时,我在TCP连接(例如文件传输)上完成工作,然后使用以下方法关闭(在客户端)与服务器的连接:

Socket mySocket_ClientSide= new Socket(); 
mySocket_ClientSide.setReuseAddress(true);
mySocket_ClientSide.bind(new InetSocketAddress(5555)); //always using the same port
mySocket_ClientSide.connect(new InetSocketAddress(serverIP,10000), myTimeout);

几秒钟后,我必须再次连接到服务器,但我得到了一个已经在使用的地址:connect&#34;异常。

我认为客户端进程的状态是TIME_WAIT,正如我在本网站的几个问题中所读到的那样。但由于setReuseAddress(true),我不能再次使用此端口吗?

由于某些原因我必须始终绑定到同一个端口(在示例5555中)。有没有任何解决方案允许我绑定到同一个端口?我在做什么错?

先谢谢你 福斯托

2 个答案:

答案 0 :(得分:1)

您的问题体现了相互矛盾的要求:

  • 您必须使用相同的源端口
  • 您必须在几秒钟内重新连接。

正如您所猜测的那样,您已经进入了TIME_WAIT状态。这是从同一源IP:端口到同一目标IP:端口的连续连接之间的强制性两分钟差距。 TCP的规则要求这种差距,以确保连接的完整性。

您可以在某些操作系统上缩短TIME_WAIT周期,但不建议这样做。相反,你应该摆脱总是使用相同端口的要求。这没有任何意义,它也可以防止你并行形成多个连接。

答案 1 :(得分:0)

您的服务器只能接受单个连接。您需要在循环中调用(Server)Socket.accept()。 accept()方法将阻塞,直到建立连接。

在您的客户端上,除非您有充分的理由这样做,否则不应将客户端端点绑定到特定端口。删除这些行:

mySocket_ClientSide.setReuseAddress(true);
mySocket_ClientSide.bind(new InetSocketAddress(5555)); //always using the same port