处理异常而不会崩溃套接字服务器?

时间:2010-12-14 18:55:38

标签: java multithreading sockets exception nullpointerexception

我正在尝试运行一个同时处理多个客户端的线程套接字服务器。然而,在我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());
}
}
}

2 个答案:

答案 0 :(得分:1)

我建议将while正文放在try / catch块中,因为任何错误都会破坏循环。

关于NPE - 似乎您在BufferedReader in;中的PrintWriter out;方法中初始化handleSessiontry。如果在初始化in和/或out之前某些内容失败,则NPE会失败,因为最后调用shutdown并关闭inout

此处发布的代码不会破坏处理程序线程accept中NPE上run的主循环。

答案 1 :(得分:1)

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

来自谷歌的第一个Executor usage example