美好的一天,Java TCP Socket不超時(在Servlet中調用)
我有一個Java Servlet,我實際上需要發送一個TCP數據包。如果連接打開,我可以成功發送數據。
但是,如果確實需要超時,它永遠不會。
我的套接字發送的代碼如下所示:
private static String sendMessage(int command,String data,int port,String ip){
try{
String sendString=Integer.toString(command)+":"+data+'$'+'\n';
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket(ip, port);
clientSocket.setSoTimeout(30000);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(sendString);
String rcvString = inFromServer.readLine();
System.out.println("FROM DEVICE: " + rcvString);
clientSocket.close();
return rcvString;
}catch(Exception e){
System.err.println(e.getMessage());
}
return NULL;
}
正如你所看到的,我將超時設置爲30秒。但是,超時需要將近80秒。有時需要60秒。它不斷變化。我將超時設置爲10秒,並且還需要很長時間。就好像這個功能根本不起作用。是什麼賦予了!?這是一個線程問題嗎?
因爲servlet調用在一個線程/線程池發生。這可能是問題嗎?我需要在servlet中進行TCP調用!上面的代碼直接在servlet中調用。 – raaj
從套接字讀取時,SO_TIMEOUT是相關的。雖然不清楚,但您似乎認爲連接套接字時超時是相關的。不是這樣。如果你想爲TCP連接指定一個超時,你應該閱讀Socket類的文檔,它會告訴你如何做到這一點。 – jarnbjo