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.
Wie wäre es mit 'timer'? http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java – TomN
Sie bellen hier den falschen Baum. Wenn Sie eine defekte Pipe bekommen, brauchen Sie kein Schreib-Timeout. – EJP