2016-08-02 49 views
2

我在處理java中的套接字時遇到了問題。 我正在運行具有多個客戶端連接的TCP服務器。如何在Java中設置Socket寫入timout?

由於性能原因,我使用了一個簡單的線程池來處理數據包。

請參考下面

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 pipeout.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

如何使用'timer'? http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java – TomN

+1

你在這裏吠叫錯誤的樹。如果你得到'斷管',你不需要寫超時。 – EJP

回答

3

如何在java中設置Socket寫入timout?

你不行。 Java中沒有套接字寫入超時。除非您做出hyperjump到NIO,非阻塞模式,Selectors

我噸異常洪水SocketException: Broken pipeout.write(buffer);

你應該只得到一個。遇到此異常時,應關閉套接字。

+0

感謝您的明確建議。它有很大的幫助〜 – BinaryProbe