2012-08-09 84 views
1

我有服務器監聽指定的IP和端口和連接到該服務器的客戶端的情況。套接字setSoTimeout澄清

String readme=bs.readline()). 

這裏bsbufferedreader對象: 現在我使用readline方法讀取來自服務器的響應。我想知道,如果讀響應之前,如果我寫這條線

socket.setSoTimeout(1000) 

,如果沒有反應過來,直到1000毫秒

插座得到超時以及是否斷開連接,或者不要斷開插座並給予空字符串readme

回答

1

套接字不會斷開連接。相反,任何閱讀方法都會拋出一個SocketTimeoutException,您可能希望在您的程序中捕獲這些異常。插座仍然可以使用,但在這種情況下readme將不被定義:

String readme; 
try 
{ 
readme = bs.readline; 
// TODO do stuff with readme 
} 
catch (SocketTimeoutException e) 
{ 
// did not receive the line. readme is undefined, but the socket can still be used 
socket.close(); // disconnect, for example 
} 

假定在IOException s的別的地方捕獲或拋出的例子。

該文檔解釋這種行爲相當不錯:Socket.setSoTimeout(int)

+0

感謝您的早期回覆。但有一點我想澄清的是,這種類型的功能是否可以在java中實現(即readline方法不會阻塞並且超時並返回到目前爲止所讀取的內容。) – user1582791 2012-08-09 18:35:40

+0

我不確定我在這裏理解你readLine()的意思是讀完整行,並且讀取系統檢索到的行的任何片段可能沒有意義,因此讀取整行或執行超時。 – 2012-08-09 21:38:52

+0

但我問這種類型的功能是否可以使用其他讀取方法如read()等來實現 – user1582791 2012-08-10 10:10:27

5

其實都不是。引發了SocketTimeoutException

docs

setSoTimeout

public void setSoTimeout(int timeout) 
        throws SocketException 

啓用與指定的超時/禁用SO_TIMEOUT,以毫秒爲單位。 如果將此選項設置爲非零超時,則與此套接字關聯的 InputStream上的read()調用將僅阻塞此 時間量。如果超時到期,將引發一個 java.net.SocketTimeoutException異常,但Socket仍然是 有效。在進入阻止 操作之前啓用選項必須啓用才能生效。超時時間必須> 0。零時間 被解釋爲無限超時。

參數:timeout - 指定的超時時間,以毫秒爲單位。 拋出:SocketException - 如果基礎協議中存在錯誤,例如TCP錯誤。