【问题标题】:Closing socket on program termination在程序终止时关闭套接字
【发布时间】:2018-01-30 18:10:34
【问题描述】:

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

【问题讨论】:

  • 您确定您的程序正在终止吗?例如。如果您使用的是swing,您会拨打jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 吗?因为否则窗口是隐藏的,但应用程序会继续运行。

标签: java sockets


【解决方案1】:

这应该适用于所有类型的应用程序(服务器、客户端、swing 等)

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我该如何关闭我的套接字

      使用close() 方法。

      当我终止我的程序时

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        相关资源
        最近更新 更多