Как я могу установить время ожидания сокета в Java?
У меня проблема с обработкой сокета в Java. Я использую TCP-сервер с несколькими клиентскими подключениями.
По соображениям производительности я использовал простой пул потоков для обработки пакетов.
Пожалуйста, смотрите код ниже
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();
но, похоже, только для получения данных от клиента.
Любой намек или совет будут очень благодарны. Пожалуйста, дайте мне знать, если вам понадобится больше кода или информации. Заранее спасибо.