У меня есть два потока, в которых запущена программа чата, один из которых является сервером, а другой - клиентом, и все работает нормально, пока я не нажму кнопку выхода.
поскольку сокет потока, в котором была нажата кнопка «Выход», асинхронно закрывается, в то время как другой сокет пытается прочитать данные, сокет чтения в потоке / living нарушается замыканием и выдает ошибку mssg, в то время как вызывается правильно закрой свою розетку и умри спокойно.
Мне нужны предложения, чтобы прийти сюда ...
это ошибка, которую я получаю:
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
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 chatSockets.ChatClient.run(ChatClient.java:56)
at java.lang.Thread.run(Unknown Source)
и это код:
public void run() {
try {
if (type==Type.CLIENT) {
socket = new Socket(HOST, PORT);
} else {
ServerSocket ss = new ServerSocket(PORT);
socket = ss.accept();
}
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (!socket.isInputShutdown()) {
chat.append(in.readLine()+"\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent e) {
String s = name + " : " + chat.getMssg();
JButton src=(JButton)e.getSource();
if (src.getText()=="Quit") {
out.close();
try {
in.close();
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0);
}
else {
out.println(s);
chat.append(s + "\n");
chat.clearPanel();
}
}