我试图运行同时处理多个客户端的线程套接字服务器。但是,当我通过telnet进入服务器然后以非优雅的方式退出后,例如关闭窗口。

服务器崩溃并返回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());
}
}
}

最佳答案

使用执行程序创建线程池,并将执行线程委托给该池。
即使一个线程引发异常,其他线程仍将处于活动状态。
您可以将“ unhandledExceptionHandler”添加到Executor,您可以在其中记录每个异常。

Google的第一个Executor usage example

09-25 17:19
查看更多