2010-12-14 94 views
0

我試圖運行一個線程套接字服務器,同時處理多個客戶端。但是,當我遠程登錄到服務器,然後以非優雅的方式退出後,通過關閉窗口說。處理異常而不會崩潰套接字服務器?

服務器崩潰並返回System.out.println("Runnable terminating with exception: " + e);ejava.Lang.NullPointerException

我的問題是我怎樣才能簡單地關閉套接字,並保持服務器運行,即使在handleSession()出現問題,以便其他人可以連接?

我是新來的異常,所以我的理解仍然是基本的。

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 2010-12-14 18:59:08

+0

這應該是8118 :) – Ash 2010-12-14 19:09:54

+0

你的BufferedReader和PrinteWriter初始化在哪裏?你有沒有發佈所有的代碼? – SRM 2010-12-14 19:22:01

回答

1

使用Executor創建線程池,並委託執行到該池的線程。 即使一個線程拋出異常,其他線程仍然處於活動狀態。 您可以將「unhandledExceptionHandler」添加到Executor,您可以在其中記錄每個異常。

第一個Executor usage example谷歌地圖

1

我會建議把while身體一個try/catch塊,因爲任何的錯誤打破了循環。

關於NPE - 似乎您在handleSession方法的try中初始化了BufferedReader in;,PrintWriter out;。如果在初始化in和/或out之前發生故障,它將因NPE而失敗,因爲shutdown最終調用並關閉inout

這裏發佈的代碼不會破壞處理線程的run中的NPE accept上的主循環。

+0

我假設你打算在'ThreadHandler'類中包裝'while'循環嗎?另外,我應該在哪裏初始化'BufferedReader'和'PrintWriter'?它在'run()'中也不起作用。 – Ash 2010-12-14 19:25:35