簡體   English   中英

套接字setSoTimeout的說明

[英]Socket setSoTimeout clarification

我有一種方案,其中有服務器在指定的IP和端口上偵聽,並且有客戶端連接到該服務器。 現在,我正在使用readline方法從服務器讀取響應:

String readme=bs.readline()).   

這里bsbufferedreader對象。 我想知道在閱讀回復之前是否寫這行

socket.setSoTimeout(1000)

如果沒有響應,直到1000毫秒

套接字是否超時並斷開連接,還是不斷開套接字並在readme提供空字符串。

實際上兩者都不是。 拋出SocketTimeoutException

文檔

setSoTimeout

 public void setSoTimeout(int timeout) throws SocketException 

以指定的超時時間啟用/禁用SO_TIMEOUT,以毫秒為單位。 通過將此選項設置為非零超時,與此套接字關聯的InputStream上的read()調用將僅在此時間量內阻塞。 如果超時到期,則盡管Socket仍然有效,但將引發java.net.SocketTimeoutException。 必須先啟用該選項,然后才能執行阻止操作。 超時必須大於0。零超時被解釋為無限超時。

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

插座不會斷開。 相反,任何讀取方法都將引發您可能希望在程序中捕獲的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被捕獲在其他地方或被拋出。

該文檔很好地解釋了此行為: Socket.setSoTimeout(int)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM