2010-12-14 98 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