0

だから私はこのシンプルなサーバーを持っています。私がやりたいのは、クライアントソケットを強制終了するときに、サーバーを実行し続け、別のクライアントを待機することです(telnet->プロセスの終了)。

private ServerSocket serv;

public Server() 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);

                while(true) {

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

private void recreateSocket() {

    try {
        ServerSocket socket = ServerSocketFactory.getDefault().createServerSocket(port);
        serv = socket;
    } catch (IOException e) {
        e.printStackTrace();
    }
}

AtmはbindException、それを処理する方法をスローします。

4

3 に答える 3

0

finally ブロックの前に catch ステートメントを追加します (ただし、そこで呼び出さないでくださいrecreateSocket()) 。

次のようなものを明確にするために更新します。

    while(true) {
        //do stuff
    }
} catch (SocketException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
      sock.close();
于 2012-05-17T21:11:31.100 に答える
0

その理由は、サーバー ソケットを再度作成しているためです。これを行う必要はありません (前のものはまだ機能しているため、バインド例外が発生します)。これはあなたがしたいことです:

  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();
    }
  }
于 2012-05-18T13:18:24.560 に答える
0

受け入れられた各接続を処理するために新しいスレッドを開始します。

于 2012-05-18T13:03:16.740 に答える