java套接字聊天代码抛出java.net.SocketException:socketclosed

java套接字聊天代码抛出java.net.SocketException:socketclosed,java,sockets,Java,Sockets,我尝试用JavaSocket API制作基本的Java聊天应用程序。但是当客户端终止时,它抛出以下异常: java.net.SocketException:套接字已关闭 我的代码 服务器 当生成的客户端以“/exit”消息终止时,BufferedReader.readLine()行抛出如下异常 java.net.SocketException: Socket closed at java.net.SocketInputStream.read(Unknown Source)

我尝试用JavaSocket API制作基本的Java聊天应用程序。但是当客户端终止时,它抛出以下异常:

java.net.SocketException:套接字已关闭

我的代码

服务器 当生成的客户端以“/exit”消息终止时,
BufferedReader.readLine()
行抛出如下异常

java.net.SocketException: Socket closed
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at com.aaa.client.ClientInputThread.run(JavaChatClient.java:80)
我认为BufferedReader流仍然尝试读取行消息,即使套接字已经关闭

但我不知道当客户端终止时,何时以及如何关闭BufferedReader流和套接字连接


我完全被这部分卡住了。有什么想法吗?

这是因为当您调用
readLine()
时,套接字是关闭的。您可以首先检查消息,如果消息是
\exit
,则首先停止
inputThread
(使用标志或其他内容),然后将
\exit
发送到服务器。简而言之,检查
/exit
->停止
inputThread
->发送
/exit
到服务器

String msg = "";
while (!msg.toLowerCase().equals("/exit")) {
    msg = keyboard.nextLine();

    if (msg.toLowerCase().equals("/exit")) {
        // stop inputThread.
        // make sure inputThread is stopped.
    }

    if (!msg.trim().equals("")) {
        pw.println(msg);
        pw.flush();
    }
}

那听起来差不多是对的。你还期望发生什么?至于处理它,为什么不显式地捕获它,然后自己清理(或者让
最终运行
处理程序)?谢谢您的回复。当客户端终止时,我会尽力清除此异常。我想知道当服务器连接终止时,如何同时关闭客户端的套接字。问题是,即使服务器端的套接字关闭,客户端的流仍然是活动的。最好的问候。我想你可以展示代码来帮助约瑟夫(和我)理解你的答案
java.net.SocketException: Socket closed
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at com.aaa.client.ClientInputThread.run(JavaChatClient.java:80)
String msg = "";
while (!msg.toLowerCase().equals("/exit")) {
    msg = keyboard.nextLine();

    if (msg.toLowerCase().equals("/exit")) {
        // stop inputThread.
        // make sure inputThread is stopped.
    }

    if (!msg.trim().equals("")) {
        pw.println(msg);
        pw.flush();
    }
}