2016-08-02 4 views
2

Ich habe ein Problem mit der Handhabung von Socket in Java. Ich führe einen TCP-Server mit mehreren Client-Verbindungen.Wie kann ich Socket schreiben Zeitüberschreitung in Java?

Aus Leistungsgründen verwendete ich einen einfachen Thread-Pool, um Pakete zu behandeln.

Bitte siehe Code unten

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); 
     } 
} 

mehrere Threads könnte sendToClient zugreifen.

dieser Code funktioniert in der Regel gut, aber manchmal (wahrscheinlich beim Überfluten?) Es hängt ohne jede Ausnahme, bis ich Client-Verbindung manuell beenden. Nachdem ich Shutdown-Client-Verbindung, dann habe ich Tonnen Ausnahme Überschwemmungen SocketException: Broken pipe von 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] 

Mein großes Problem ist, dass Server hängen könnte, bis Client-Verbindung beenden. Ich denke, wenn ich eine Zeit für das Schreiben festlegen kann dann Server die Verbindung selbst schließen, aber ich konnte nicht den passenden Weg dafür finden.

Ich habe versucht socket.setSoTimeOut(); als auch, aber es scheint nur für den Empfang von Daten vom Client.

Jeder Hinweis oder Rat wird sehr geschätzt. Bitte lassen Sie mich wissen, wenn mehr Code oder Informationen benötigt werden, um dies herauszufinden. Vielen Dank im Voraus.

+0

Wie wäre es mit 'timer'? http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java – TomN

+1

Sie bellen hier den falschen Baum. Wenn Sie eine defekte Pipe bekommen, brauchen Sie kein Schreib-Timeout. – EJP

Antwort

3

Wie kann ich Socket schreiben Timout in Java?

Sie können nicht. In Java gibt es kein Socket-Schreib-Timeout. Sofern Sie nicht den Hypersprung zu NIO, nicht-blockierenden Modus machen, Selectors usw.

Ich habe Tonnen Ausnahme Überschwemmungen SocketException: Broken pipe von out.write(buffer);

Sie nur einen bekommen soll. Sie sollten den Socket schließen, wenn Sie diese Ausnahme erhalten.

+0

Danke für die klare Beratung. Es hilft viel ~ – BinaryProbe

Verwandte Themen