我在處理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 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();
,但它似乎只適用於從客戶端接收數據。
任何提示或建議將不勝感激。 請讓我知道如果需要更多的代碼或信息來弄清楚。 在此先感謝。
如何使用'timer'? http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java – TomN
你在這裏吠叫錯誤的樹。如果你得到'斷管',你不需要寫超時。 – EJP