【问题标题】:Close ServerSocket in java [duplicate]在java中关闭ServerSocket [重复]
【发布时间】:2014-01-18 03:09:09
【问题描述】:

我有以下程序:

package testServer;

import java.io.IOException;
import java.net.*; 

public class MainClass {

    public static void main(String[] args) throws IOException {
         ServerSocket socket = new ServerSocket (8073);
         socket.close();
    }
}

如您所见,我在程序结束时关闭了我的套接字。但是,当我重新启动程序时,我得到了 例外:

  Exception in thread "main" java.net.BindException: Address already in use
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:521)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:414)
    at java.net.ServerSocket.bind(ServerSocket.java:326)
    at java.net.ServerSocket.<init>(ServerSocket.java:192)
    at java.net.ServerSocket.<init>(ServerSocket.java:104)
    at testServer.MainClass.main(MainClass.java:10)

为什么会这样?我认为在调用close() 之后,端口可以被重用。 我通过netstat检查了这个套接字没有在其他任何地方使用。

【问题讨论】:

  • 您确定该端口没有在其他地方使用吗?在您再次尝试运行之前确定该程序已关闭?
  • @Makoto 是的,我通过 netstat 进行了检查
  • 套接字永远绑定?或者如果您等待某个时间端口被释放?也许与操作系统有关。
  • @molokoV 套接字我永远丢失了

标签: java sockets


【解决方案1】:

它应该可以工作(至少它对我有用)。

我猜您在 IDE 中某处的代码调试会话已暂停。

【讨论】:

    【解决方案2】:

    你可能之前运行过这个程序,但由于某种原因没有正确关闭套接字,所以它仍然可以打开(或另一个阻塞网络状态),而不是让你再次监听它。

    由于您在 Windows 上运行,您可以使用 TCPView 检查正在使用此端口的内容(如果是这种情况,请杀死那个混蛋)。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多