程序终止时关闭套接字

时间:2018-01-29 21:40:23

标签: java sockets

我有一个服务器/客户端程序,允许客户端向服务器发送请求,我的程序工作正常但我遇到了一个问题,我注意到当我一遍又一遍地测试程序时我使用的端口在上一次运行中无法在新运行中使用,旧的套接字永远不会关闭,这将占用我的计算机上的CPU,直到我关闭我的IDE然后关闭任务管理器中的java实例。我的IDE中有警告下划线,告诉我我的套接字永远不会关闭,我的问题是当我终止程序时如何关闭套接字以确保它不会占用我的CPU并继续占用端口?

3 个答案:

答案 0 :(得分:0)

确保socket已关闭。以下代码应该为您解决问题。

try {
      socket.close();
      System.out.println("Server has been successfully shut down!");
} catch (IOException e) {
      e.printStackTrace();
}

请注意,如果您尝试按Ctrl+Z来停止申请,则该流程不会终止。基本上,Ctrl+Z发送负责暂停进程的SIGTSTP信号,因此,应用程序使用的所有资源(包括网络套接字)仍然有效。

答案 1 :(得分:0)

这适用于所有类型的应用程序(服务器,客户端,摇摆,你有什么)

Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
  try {
    socket.close(); 
  } catch (IOException e) {
    throw new RuntimeException(e);
  }
}));

答案 2 :(得分:0)

  

我究竟如何关闭套接字

使用close()方法。

  

当我终止我的程序时

如果真的有必要,在关机钩子中,但你肯定可以干净地关闭程序吗?

  

确保它不会耗尽我的CPU并继续占用端口?

正在使用的端口不会永远持续下去,当然会占用CPU。

您需要查看ServerSocket.setReuseAddress(true),并注意在绑定套接字之前必须调用它。