Мой код выглядит следующим образом. Когда приходит запрос, сервер создает два потока (производитель-потребитель шаблон):многопоточный TCP-сервер: java.net.SocketException: Socket closed
...
while(true) {
Socket clientSocket = server.accept();
System.out.println("Got connection!");
Thread consumerThread = new Thread(new ConsumerThread(sharedQueue, clientSocket));
Thread producerThread = new Thread(new ProducerThread(sharedQueue, clientSocket));
consumerThread.start();
producerThread.start();
}
...
Потребитель нить читает то, что послал клиент и производитель нить отвечает обратно. Потребитель:
@Override
public void run() {
try {
while (true) {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// read, do actions
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Производитель:
@Override
public void run() {
try {
out = new PrintStream(clientSocket.getOutputStream(), true);
// some actions
out.println("something");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Но в сервере я получаю следующее сообщение об ошибке:
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at ee.ut.ds.server.ConsumerThread.run(ConsumerThread.java:30)
at java.lang.Thread.run(Thread.java:745)
Что может вызвать это? Я даже вижу, что клиент принимает сообщение правильно. Кроме того, в потоке производителя я закрываю сокет. Я не понимаю.
Я думаю, что вы должны выполнить свою работу с потоком ввода и вывода в 1 потоке, чтобы правильно закрыть сокет. Если вы хотите обрабатывать входные и выходные данные параллельно: запустите новые потоки из потока, где вы обрабатываете ввод/вывод и используете правильную синхронизацию для закрытия сокета, когда вся работа выполняется. – pomkine