2013-07-31 34 views
-1

我正在測試一個套接字寫入字節到服務器並讀取響應的測試工具。我有一個問題,最後一次讀取Socket的InputStream會暫停20秒。我解決了這個問題,但不明白它爲什麼起作用。爲什麼設置SO_TIMEOUT會導致SocketInputStream的最終讀取立即返回?

下面的方法給出了一個java.net.SocketInputStream。 讀取(byte [],int,int)的呼叫在最後一次讀取中暫停20秒,返回-1,指示流結束。

private String getResponse(InputStream in) throws IOException { 

    StringBuffer buffer = new StringBuffer(); 
    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    byte[] data = new byte[1024]; 
    int bytesRead = 0; 
    while (bytesRead >= 0) { 
     bytesRead = in.read(data, 0, 1024); // PAUSED HERE ON LAST READ 
     if (bytesRead > 0) { 
      bout.write(data, 0, bytesRead); 
     } 
     buffer.append(new String(data)); 
    } 
    return buffer.toString(); 
} 

我能夠通過在套接字上設置SO_TIMEOUT來讓暫停消失。這似乎並不重要,我設置它。即使使用socket.setSoTimeout(60000),上述方法中讀取的問題也會在流結束時立即返回。

這裏發生了什麼?爲什麼將SO_TIMEOUT設置爲高值,會導致SocketInputStream的最終讀取立即返回?

+0

SO_TIMEOUT沒有這種效果。這裏真正的問題是爲什麼暫停?這隻能由發件人緩慢發送最終數據來解釋。 – EJP

回答

1

這聽起來不合情理。設置套接字超時不應該有這種效果。

我認爲最有可能的解釋是,你改變別的東西就是有固定的暫停。 (如果我猜測,服務器現在正在關閉它以前沒有做過的插槽)。

如果這樣做沒有幫助,您將需要提供其他人可以使用的SSCCE運行以觀察效果。並告訴我們您使用的平臺是什麼。

+0

意思是迴應這個月前。你確實是對的。服務器改變爲關閉套接字,這就是爲什麼最終的InputStream.read立即開始返回,如預期的那樣。謝謝。 – Michael

相關問題