2017-10-14 43 views
0

我工作的一些項目,需要服務器和客戶端應用程序之間的低延遲通信。兩者都在我的電腦上運行,因此它連接到本地主機。的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); 
} 

謝謝!

凱斯基

+0

你有沒有試圖讓運行的應用程序的一些統計數據?我的想法之一是GC期間可能發生的Stop The World事件。下面是如何監控GC上的參考:https://www.cubrid.org/blog/how-to-monitor-java-garbage-collection –

+0

我已經試過了,但現在似乎並沒有引起問題 - 也嘗試在服務器和客戶端的每個網絡幀的開始處手動運行System.gc() - 默認情況下,它將測量的ping增加約6-8ms,但in.read()仍然會阻塞300ms,因此它會測量306-308ms – Kaisky

回答

0

我找到了解決方案!

好像DataInputStream所DataOutputStream類不適合低延遲網絡,但你應該使用的BufferedInputStream的BufferedOutputStream代替。

由於每個輸入都是以字節爲單位的,因此您需要將任何int,double和String轉換爲字節數組並將它們轉換回來,所以我花了一段時間來做到這一點,但現在它完美無缺任何滯後。