0
我遇到了我懷疑是TCP的行爲,但是我不明白,並希望得到幫助。在定期調用的循環中通過TCP發送的第一個請求花費了很多時間
定期調用通過TCP發送請求並讀取響應的循環。
無論循環的大小如何,發送的第一個請求 - 響應對幾乎總是比其他對需要更多的時間。
這不會發生當我在同一臺機器上運行客戶端和服務器,因此我懷疑這是與TCP有關。
的代碼示例波紋管示出了該問題:
調用每一秒:
for (int sentPackets = 0; sentPackets < totalPackets; sentPackets++) {
// send request
stream.write(packet);
stream.flush();
long sentAt = System.currentTimeMillis();
// read response
String response = StreamReader.read(inputStream, buffer);
long receivedAt = System.currentTimeMillis();
long dif = receivedAt - sentAt;
System.out.println("dif: "+ dif);
StreamReader
是utilty從套接字讀取。
read方法實現以下所示的:
public static String read(DataInputStream stream, byte[] buffer) throws IOException {
int totalBytes = 0;
// keep reading from stream until entire packet is available
while (totalBytes < buffer.length) {
// read into buffer, from position of latest byte read, up to size of buffer
int bytesRead = stream.read(buffer, totalBytes, buffer.length - totalBytes);
// premature end of stream
if (bytesRead == -1) {
System.out.println("unexpected end of stream during socket read operation");
break;
}
else
totalBytes = bytesRead;
}
return new String(buffer);
}
有時間戳之間沒有其他操作,只寫和讀插座。
在導致此行爲的循環之間會發生什麼,而這不會發生在本地主機上?
波紋管是一些可視化的例子。
dif: 172
dif: 15
dif: 0
dif: 0
dif: 0
dif: 0
dif: 0
dif: 0
dif: 203
dif: 0
dif: 16
dif: 0
dif: 47
dif: 0
dif: 0
dif: 16
dif: 16
dif: 16
dif: 0
dif: 0
我正在閱讀,並在鏈接中提到寫讀寫讀取是好的。所以不確定什麼是好的。另外,我可以禁用它從Java的特定連接或其OS範圍設置? – John
這工作,並實際上解決了我有過的另一個問題。非常感謝你。 – John
用於特定連接。 –