首页 > 解决方案 > 在控制台应用程序终止的情况下如何正确关闭 java.net ServerSocket?

问题描述

使用 eclipse 多次运行和终止我的 java 程序时,会发生异常:

Exception in thread "main" java.net.ConnectException: Connection refused: connect

我知道这是因为我在上次执行期间打开的套接字没有关闭。

我试过:(1)Runtime.getRuntime().addShutdownHook 关闭 SocketServer 实例

(2) 在 finally 块中关闭 ServerSocket 实例

    public static void main(String ... args) throws Exception {
    // propagating Exception(s) to main method for brevity
    ServerSocket serverSocket = new ServerSocket(55555, 100,
    InetAddress.getByName("localhost"));
    System.out.println("Server started  at:  " + serverSocket);

    while (true) {

      System.out.println("Waiting for a  connection...");
      final Socket activeSocket = serverSocket.accept();

      System.out.println("Received a  connection from  " + activeSocket);
      Runnable runnable = () ->  {
         try {
          BufferedReader socketReader = null;
          BufferedWriter socketWriter = null;
          socketReader = new BufferedReader(new InputStreamReader(activeSocket.getInputStream()));
          socketWriter = new BufferedWriter(new OutputStreamWriter(activeSocket.getOutputStream()));
          String incomingMsg = null;
          while ((incomingMsg = socketReader.readLine()) != null) {
              socketWriter.write("Response for message: "+incomingMsg+"\r\n"); // Just a dummy code for brevity
              socketWriter.flush();
          }
         } catch(Exception ex) {
             // I do nothing here for brevity
         }

      };

      new Thread(runnable).start();

    }
   }
   }

谁能帮我理解我应该如何解决这个问题以及在异常终止的情况下如何正确关闭 ServerSocket?

标签: javasockets

解决方案


推荐阅读