我正在測試一個套接字寫入字節到服務器並讀取響應的測試工具。我有一個問題,最後一次讀取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的最終讀取立即返回?
SO_TIMEOUT沒有這種效果。這裏真正的問題是爲什麼暫停?這隻能由發件人緩慢發送最終數據來解釋。 – EJP