Java 为什么';t socket.close()释放绑定端口?

Java 为什么';t socket.close()释放绑定端口?,java,sockets,Java,Sockets,我正在向TCP服务器发送一条消息,在运行该消息之后,当我再次尝试运行它时,得到java.net.BindException:Address ready in use错误。我估计插座会被解开;不过,我在文档中找不到任何明确的说明。如何释放端口,我是否在此处正确结束事务?这是我的客户: public class TcpPingClient { public static void main(String[] args) throws Exception { Socket tcpSo

我正在向TCP服务器发送一条消息,在运行该消息之后,当我再次尝试运行它时,得到
java.net.BindException:Address ready in use
错误。我估计插座会被解开;不过,我在文档中找不到任何明确的说明。如何释放端口,我是否在此处正确结束事务?这是我的客户:

public class TcpPingClient {
   public static void main(String[] args) throws Exception {
      Socket tcpSocket = new Socket();
      tcpSocket.bind(new InetSocketAddress("192.168.1.2", 45030));
      tcpSocket.connect(new InetSocketAddress("192.168.1.2", 1211));
      DataOutputStream out = new DataOutputStream(tcpSocket.getOutputStream());
      out.writeBytes("oh hey\n");
      tcpSocket.close();
   }
}

它是未绑定的,但等待超时,以防另一端需要在发送方端缓冲一些数据。如果希望在不等待这种情况发生的情况下重新使用端口,可以使用

socket.setReuseAddress(true);
必须在尝试绑定之前设置此选项


简言之,这是TCP的实现方式,而不是Java的一项功能。

套接字在您关闭后会保持时间等待状态一段时间。这是由操作系统完成的,以确保通信已完成。

您可能需要阅读,尤其是查看

当一个套接字关闭时,它将处于状态
TIME\u WAIT
,并且当它关闭时,其他套接字可能不会绑定到同一地址


也就是说,除非第一个(现在已关闭)套接字设置了“重用地址”标志。此标志允许将另一个套接字绑定到与处于
TIME\u WAIT
状态的现有套接字相同的地址。

为什么要将本地套接字绑定到特定端口,即(通常)unnecessary@DiegoCNascimento没错,而且通常随机的本地端口工作得很好。@Diegocnascemento我没有错。TCP客户端不需要调用bind()或将自身绑定到特定端口,这正是您上面所说的。你刚才自己也说过同样的话。下定决心。好吧,你自己不需要绑定到本地端口,系统只需要选择一个随机的免费本地端口并绑定。@EJP你忘了一个:)如果你想说,请不要直接指向我,我重写我的评论,我认为现在更清楚了。我认为这不是一个好方法,因为它浪费了等待状态功能的时间。如果需要,操作系统可以/也可以不改变等待时间。例如,在基于Windows NT的情况下。无论如何,我认为一个好的应用程序将需要改变或处理时间等待。