У меня проблема с обработкой сокета в java. Я запускаю TCP-сервер с несколькими клиентскими подключениями.Как установить Socket write timout в java?
Для удобства использования я использовал простой пул потоков для обработки пакетов.
Пожалуйста, смотрите ниже код
public enum LazyWorkCenter {
instance;
LazyWorkCenter() {
lazyWorker = new NamedThreadPoolExecutor(3,3, 0L,TimeUnit.MILLISECONDS, "LazyWorker");
}
private ExecutorService lazyWorker ;
public void executeLazy(Runnable lazyTask) {
lazyWorker.execute(lazyTask);
}
}
public class TcpServerForClient {
DataOutputStream out = null;
DataInputStream in = null;
public void onConnect(ServerSocket socket) throws IOException {
Socket client = server.accept();
client.setSoTimeout(1000 * 10);
out = new DataOutputStream(client.getOutputStream());
in = new DataInputStream(client.getInputStream());
}
public void sendToClient(byte[] buffer) {
Runnable lazy =() -> {
out.write(buffer);
out.flush();
};
LazyWorkCenter.instance.executeLazy(lazy);
}
}
несколько потоков может получить доступ к sendToClient
.
Этот код обычно работает нормально, но в некоторых случаях (возможно, при наводнении?) Он зависает без каких-либо исключений, пока я не выключу клиентское соединение вручную. После подключения клиента я выключения, то я получил тонны исключения затопления SocketException: Broken pipe
из out.write(buffer);
7053555 [LazyWorker-1] 09:57:35.268 [ERROR] [[email protected]:44] - error found
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.8.0_91]
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[na:1.8.0_91]
at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[na:1.8.0_91]
at java.io.DataOutputStream.write(DataOutputStream.java:107) ~[na:1.8.0_91]
at java.io.FilterOutputStream.write(FilterOutputStream.java:97) ~[na:1.8.0_91]
Моя главная проблема в том, что сервер может висеть до тех пор, пока клиент не бросить соединение. Я думаю, что если я смогу установить время для записи, сервер может закрыть соединение сам по себе, но я не смог найти подходящий способ для этого.
Я также пробовал socket.setSoTimeOut();
, но, похоже, только для получения данных от клиента.
Любые подсказки или советы будут очень благодарны. Пожалуйста, дайте мне знать Если вам нужно больше кода или информации, чтобы понять это. Спасибо заранее.
Как насчет использования 'таймер'? http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java – TomN
Здесь вы лаете не то дерево. Если вы получаете 'broken pipe', вам не нужно тайм-аута записи. – EJP