2015-04-04 62 views
1

我正在創建一個實時服務器客戶端應用程序,服務器發送一些繪畫命令並且客戶端繪製它們。我在我的Mac中開發了整個應用程序。一切工作都沒有錯誤,所以我決定在Windows機器上測試它。滯後於實時服務器/客戶端應用程序

經過大量的調試和測試,我已經隔離了這個問題。服務器發送每15毫秒的秩序。行爲在每個環境急劇變化

的Mac

客戶端接收與不同的響應時間(結果=實時應用)

System.currentTimeMillis() 
Calling repaint: 1428155128955//Reception Time different 
Calling repaint: 1428155129162 
Calling repaint: 1428155129178 

的順序Windows

客戶端在同一個(結果=滯後應用程序)接收多個訂單。多達5個訂單,同時收集

System.currentTimeMillis() 
Calling repaint: 1428155129524//Reception time the same 
Calling repaint: 1428155129524 
Calling repaint: 1428155129524 

我想強調這是上使用相同的互聯網連接這兩個環境相同的運行的JAR,我已經上傳兩個視頻來說明問題

MAC視頻 - 實時https://youtu.be/OhNXdGXoQpk

的Windows視頻 - 滯後https://youtu.be/OhNXdGXoQpk

我也進行了直播的VisualVM的Windows中的視頻: https://youtu.be/cRNX4b3rlZk。我沒有看到任何奇怪的東西可以解釋爲什麼發生滯後,但我遠不是一個專家(抱歉低質量)。

此外,我已經試過

  • 增加堆大小
  • 使用特殊的垃圾收集器

    -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=2 -XX:+AggressiveOpts 
    

什麼能這麼厲害影響性能?有沒有可能的解決方案?

我沒有線索,可能是什麼原因導致了滯後。

預先感謝您

更新

以下@Hannes的意見,我也嗅到服務器和客戶端之間的所有通信後,結果如下:

數據包在不同時間到達。但我不知道爲什麼包累加(這是一個簡單的TCP連接):

clientSentence = inFromClient.readLine(); 
System.out.println("Arrived: "+ System.currentTimeMillis()); 
//paint 

,並在同一時間讀取。

更麻煩的是爲什麼它在我的Mac環境中工作....

我還測試Socket.setTcpNoDelay(boolean)沒有任何改善

+0

嗅探流量。這會給你包裹抵達的時間。這也可能是一個緩衝問題...... – Hannes 2015-04-04 14:52:12

+0

溝通方式是什麼? TCP? – wilx 2015-04-04 15:10:35

+0

嗨,謝謝你的回答,我已經更新了我的問題。目標是發送形狀(=字符串),它是一個基本的TCP連接 – 2015-04-04 15:47:25

回答

相關問題