我工作的一些項目,需要服務器和客戶端應用程序之間的低延遲通信。兩者都在我的電腦上運行,因此它連接到本地主機。的java:I /客戶端/服務器套接字O流造成隨機300ms的延遲
經由DataInputStream所和DataOutputStream類和插座連接的數據傳輸正常工作,和的99%的時間所測得的平爲0毫秒或1毫秒,然而有時通信被隨機通過300毫秒的延遲。
喜歡網絡遊戲的正常應用,而無需任何「lagspikes」運行良好,所以我敢肯定,這不是我的電腦的問題。
我覺得很可疑,延遲總是正好300ms的當它發生和0毫秒時或不發生的1ms的,所以有事情發生,但我無法找出什麼。
我登錄時間戳,直到搞清楚它在服務器和客戶端在任何
in.read();
與在情況都作爲DataInputStream類這樣的IM假設延遲是不能直接在我的代碼。
誰能給我解釋一下,什麼在Java中的I/O流或插座導致一個300ms的延遲,如何解決呢?我改變了服務器/客戶端的唯一事情是
socket.setPerformancePreferences(0, 1, 0);
但它並沒有改變任何事情。
我的代碼是有點大,但對於服務器和客戶端應用程序的相關部分的總體結構如下:提前
while(still_alive) {
out.writeInt(data1);
out.writeInt(data2);
out.writeDouble(data3);
data1 = in.readInt();
data2 = in.readInt();
data3 = in.readDouble();
DoSomethingWithData(data1, data2, data3);
}
謝謝!
凱斯基
你有沒有試圖讓運行的應用程序的一些統計數據?我的想法之一是GC期間可能發生的Stop The World事件。下面是如何監控GC上的參考:https://www.cubrid.org/blog/how-to-monitor-java-garbage-collection –
我已經試過了,但現在似乎並沒有引起問題 - 也嘗試在服務器和客戶端的每個網絡幀的開始處手動運行System.gc() - 默認情況下,它將測量的ping增加約6-8ms,但in.read()仍然會阻塞300ms,因此它會測量306-308ms – Kaisky