我正在尝试运行一个同时处理多个客户端的线程套接字服务器。然而,在我telnet到服务器然后以非优雅的方式退出之后,请关闭窗口。
服务器崩溃并返回System.out.println("Runnable terminating with exception: " + e );
,e
为java.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 :(得分:1)
我建议将while
正文放在try / catch块中,因为任何错误都会破坏循环。
关于NPE - 似乎您在BufferedReader in;
中的PrintWriter out;
方法中初始化handleSession
,try
。如果在初始化in
和/或out
之前某些内容失败,则NPE会失败,因为最后调用shutdown
并关闭in
和out
。
此处发布的代码不会破坏处理程序线程accept
中NPE上run
的主循环。
答案 1 :(得分:1)
使用Executor创建线程池,并将执行的线程委托给该池。 即使一个线程抛出异常,其他线程仍将处于活动状态。 您可以向Executor添加“unhandledExceptionHandler”,您可以在其中记录每个异常。
来自谷歌的第一个Executor usage example