2013-04-15 99 views
0

我有一臺連接客戶端的服務器來接收一個字符串,但是當連接丟失時服務器會保持相同的狀態,並且不會回到它嘗試的狀態再次建立連接。我用setSoTimeout但它不工作。setSoTimeout在java tcp連接中不起作用

這裏是我的代碼:

ServerSocket welcomeSocket = null; 
       Socket connectionSocket = null; 
       BufferedOutputStream outToClient = null; 

       try { 
        System.out.println("connecting to send "+fileToSend); 

        welcomeSocket = new ServerSocket(3249); 
        connectionSocket = welcomeSocket.accept(); 



        connectionSocket.setSoTimeout(10000); 
        welcomeSocket.setSoTimeout(10000); 
        outToClient = new BufferedOutputStream(connectionSocket.getOutputStream()); 


       } catch (Exception ex) { 
        System.out.println("set so"); 
        break; 
        // Do exception handling 
       } 

有人能告訴我這是爲什麼不拋出異常?

回答

3

您需要實際上在客戶端輸入流上調用read以觸發SO超時。如果所述read呼叫阻塞的時間超過超時設置,則只會觸發異常。

此外,它在服務器套接字上設置SO超時無用,因爲您在服務器端永遠不會「讀取」它。

+0

你能給我提供一些代碼怎麼做 – Cbour

+0

你可以在客戶端套接字輸入流上使用任何讀取方法,例如'connectionSocket.getInputStream()。read()'。有關其他選項,請參閱[Javadoc for InputStream](http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html)。 – Perception

+0

這不是無用的。它爲accept()提供超時。 – EJP