Java 套接字终止后维护服务器

Java 套接字终止后维护服务器,java,Java,所以我有一个简单的服务器。我想做的是,当我终止客户机套接字(telnet->end进程)时,让服务器运行并等待另一个客户机 Atm it抛出bindException,如何处理它。在finally块之前添加catch语句(但不要在那里调用recreateSocket()) 更新以澄清,如下所示: while(true) { //do stuff } } catch (SocketException e) { e.printStackTrace(); } c

所以我有一个简单的服务器。我想做的是,当我终止客户机套接字(telnet->end进程)时,让服务器运行并等待另一个客户机

Atm it抛出bindException,如何处理它。

在finally块之前添加catch语句(但不要在那里调用
recreateSocket()

更新以澄清,如下所示:

    while(true) {
        //do stuff
    }
} catch (SocketException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
      sock.close();

启动一个新线程来处理每个已接受的连接。

原因是您正在再次创建服务器套接字。您不需要这样做(前一个仍在工作,这就是为什么会出现绑定异常)。这就是您想要做的:

  private ServerSocket serv;

  public Server(int port) throws IOException
  {

    try {
      serv = new ServerSocket(port);
      serv.setReuseAddress(true);

      while(true) {
        Socket sock = serv.accept();

        try {
          BufferedReader netIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
          PrintWriter netOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true);

          // do stuff
        } catch(SocketException e) {
          e.printStackTrace();
        } finally {
          sock.close();
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

当我在终止套接字后尝试连接时,我得到:无法打开到主机的连接,在端口8888上:连接失败更新答案以澄清。如果客户端强制终止连接(如关闭连接),它将在服务器中生成异常,而您不是在内部循环中捕获它,而是在外部捕获它,从而杀死
ServerSocket
。所以,这就是为什么我建议在内部循环中添加一些catch语句。
  private ServerSocket serv;

  public Server(int port) throws IOException
  {

    try {
      serv = new ServerSocket(port);
      serv.setReuseAddress(true);

      while(true) {
        Socket sock = serv.accept();

        try {
          BufferedReader netIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
          PrintWriter netOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true);

          // do stuff
        } catch(SocketException e) {
          e.printStackTrace();
        } finally {
          sock.close();
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }