0

複数のクライアントを同時に処理するスレッドソケットサーバーを実行しようとしています。しかし、私がサーバーにtelnetして非優雅な方法で終了した後は、ウィンドウを閉じてください。ソケットサーバーをクラッシュさせずに例外を処理しますか?

サーバーがクラッシュし、ejava.Lang.NullPointerExceptionであるSystem.out.println("Runnable terminating with exception: " + e);を返します。

私の質問は、ソケットを閉じて何かが間違っていても他の人が接続できるようにするにはどうすればいいですか?

私は例外的に新しいので、私の理解はまだ基本的です。

publc class ThreadedHandler implements Runnable { 
    Socket incoming; 
    BufferedReader in; 
    PrintWriter out; 
    SortedTopicList topics; 

    ThreadedHandler(Socket s) { 
     incoming = s; 
    } 
    public void run() { 
     try { 
      handleSession(incoming); 
     }catch (Exception e) { 
      System.out.println("Runnable terminating with exception: " + e); 
     } 
     } 

    public void handleSession(Socket client) { 
     try { 
      //Code goes here 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } finally { 
      shutdown(); 
     } 
    } 

    public void shutdown() { 
     try { 
      in.close(); 
      out.close(); 
      incoming.close(); 
     } catch (Exception e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

次のように私の主な方法は次のとおりです。

public class MessageBoardServer { 

    public static void main(String[] args) { 
     Thread t; 
     try { 
      ServerSocket ss = new ServerSocket(118118); 
      while(true) { 
       Socket session = ss.accept(); 
       t = new Thread(new ThreadedHandler(session)); 
       t.start(); 
      } 

} catch (Exception e) { 
    System.err.println(e.getMessage()); 
} 
} 
} 
+0

何ですか? '118118'上のサーバソケット?できます? – khachik

+0

これは8118でなければなりません:) – Ash

+0

BufferedReaderとPrinteWriterはどこで初期化されていますか?すべてのコードを投稿しましたか? – SRM

答えて

1

Executorを使用してスレッドプールを作成し、実行中のスレッドをそのプールに委任します。 1つのスレッドが例外をスローした場合でも、他のスレッドはまだアクティブです。 Executorに "unhandledExceptionHandler"を追加すると、すべての例外を記録できます。

最初にExecutor usage example google

1

何らかのエラーがループが壊れるので、私は、try/catchブロック内while体を置くことをお勧めします。 NPEについて

は - あなたがtryで、handleSessionメソッド内BufferedReader in;PrintWriter out;を初期化しているようです。前に何かが失敗すると、inおよび/またはoutが初期化されます。shutdownが最後に呼び出され、inおよびoutが閉じられるため、NPEで失敗します。

ここに投稿されたコードは、ハンドラスレッドのrunのNPEのaccept周りのメインループを破ることはありません。

+0

'ThreadHandler'クラスで' while'ループをラップすることを意味すると思いますか? 'BufferedReader'と' PrintWriter'をどこで初期化すべきですか? 'run()'では動作しません。 – Ash

関連する問題