java - 处理异常而不导致套接字服务器崩溃?

标签 java multithreading sockets exception nullpointerexception

我正在尝试运行一个同时处理多个客户端的线程套接字服务器。但是,当我远程登录到服务器然后以非优雅的方式退出(例如关闭窗口)时。

服务器崩溃并返回 System.out.println("Runnable termination 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());
}
}
}

最佳答案

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

第一Executor usage example来自谷歌

关于java - 处理异常而不导致套接字服务器崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4443024/

相关文章:

java - 即使设置了System.setErr(),也无法使用自定义PrintStream打印错误

c++ - 使用带有事件循环和 QSocketNotifiers 的线程发出串行端口监视

java - 错误请求和超时

java - 如何设置标签/文本的值

java - JAR list 中的默认参数

java - 如何使用spring在响应消息头中将内容类型设置为text/xml

java DOM XML 解析器 getElementsByTagName() 不工作

c# - 何时在 UI 应用程序中调用 SynchronizationContext.SetSynchronizationContext()?

java - 将套接字对象传递给 Android 上的另一个 Activity

java - GUI 未按预期更新/控制流问题