2013-07-04 19 views
0

美好的一天,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秒,並且還需要很長時間。就好像這個功能根本不起作用。是什麼賦予了!?這是一個線程問題嗎?

+0

因爲servlet調用在一個線程/線程池發生。這可能是問題嗎?我需要在servlet中進行TCP調用!上面的代碼直接在servlet中調用。 – raaj

+2

從套接字讀取時,SO_TIMEOUT是相關的。雖然不清楚,但您似乎認爲連接套接字時超時是相關的。不是這樣。如果你想爲TCP連接指定一個超時,你應該閱讀Socket類的文檔,它會告訴你如何做到這一點。 – jarnbjo

回答

0

您正在設置連接後的超時時間。

試試這個:

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

     Socket clientSocket = new Socket(); 
     InetAddress addr = InetAddress.getByName(ip); 
     SocketAddress sockaddr = new InetSocketAddress(addr, port); 
     clientSocket.connect(sockaddr, 20000); // 20 seconds time out 

     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; 
} 
+0

謝謝!這有幫助! – raaj

+0

他正在設置連接後的讀取超時。沒有錯,但它是一個讀超時,而不是連接超時。此代碼使用連接超時,但完全省略了讀取超時。 – EJP