2016-08-02 15 views
2

У меня проблема с обработкой сокета в 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();, но, похоже, только для получения данных от клиента.

Любые подсказки или советы будут очень благодарны. Пожалуйста, дайте мне знать Если вам нужно больше кода или информации, чтобы понять это. Спасибо заранее.

+0

Как насчет использования 'таймер'? http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java – TomN

+1

Здесь вы лаете не то дерево. Если вы получаете 'broken pipe', вам не нужно тайм-аута записи. – EJP

ответ

3

Как установить время записи Socket в java?

Вы не можете. В Java нет времени ожидания записи сокета. Если вы не сделаете hyperjump в НИО, режим, Selectors и т.д.

неблокирующая я получил тонны исключения затопления SocketException: Broken pipe из out.write(buffer);

Вы должны получить только один. Вы должны закрыть сокет, когда получите это исключение.

+0

Спасибо за четкое пособие. Это помогает много ~ – BinaryProbe