2012-02-06 121 views
0

我有一個關於服務器 - 客戶端數據傳輸的問題。數據在滿足簡單協議後由客戶端發送。但是我發現服務器端存在延遲。客戶端和服務器在具有帶SSD和8 GB RAM的i5內核的同一臺PC上進行測試。服務器端延遲

我如何測量延遲的方式是,在客戶端發送「發送」之後,雙方以毫秒爲單位寫入當前系統時間。數據本身就是客戶端發送的當前系統時間。服務器正在檢查它在服務器端延遲了多少。它從0ms開始,增加到90ms,穩定在40ms。我不知道這個延遲是否正常。

這裏是服務器的(多線程)的代碼:

....  
     while(!ScriptWillAcessHere){ 

      inputLine = in.readLine(); 

      //Greetings 
      if(i==0) 
      { 
       outputLine = SIMONSAYS.processInput(inputLine); 
       out.println(outputLine); 
      } 

      if(inputLine.equals("Sending")){ 
       i = 1; 
      } 


      if(i>=1){ //Javascript will access this block  

       if(i==1){ 
        StartTime = System.currentTimeMillis(); 
        System.out.println(StartTime); 
        i++; 
       } 

       Differences = System.currentTimeMillis() - Double.parseDouble(inputLine); 

       saveSvr.write(Double.toString(Differences)+"\n"); 
       ... 
       //Checking elapsed time below: 
      } 
     } 

這裏是在客戶端(單螺紋)的代碼:

  .... 
      if(Client.equals("Sending")) 
      { 

       while(bTimer) 
       {       
        ins++; 
        local_time = System.currentTimeMillis();       

        out.println(local_time);       

        if(ins >= 100000) 
        { 
         out.println("End of Message"); 
         break; 
        } 

       }      
      } 

謝謝,

+0

OK,**上有Double.parseDouble性能問題()在while()循環。**我刪除此代碼,將其改爲saveSvr.write(inputLine)和他們不同的項目進行比較。他們是相同的,沒有延遲。 – user1098761 2012-02-06 23:24:02

+1

如果這確實解決您的問題,請張貼它作爲一個答案,也可以肯定只要時間允許_accept_它。 – 2012-02-09 05:07:50

回答

0

這代碼必須從while()循環中移除。它會導致大量的CPU流量和服務器端的延遲。

Differences = System.currentTimeMillis() - Double.parseDouble(inputLine); 

相反,如果有人需要服務器端的本地時間來比較客戶端本地時間,用ping對方先然後保存其本地時間傳輸的開始,然後在服務器節省。

如果集線器沒有延遲,ping將會指示最大。 1毫秒延遲,並且兩個本地時間必須相同。

當然,客戶端的本地時間必須根據服務器時間進行調整;這就是爲什麼我們需要在傳輸開始時保存當地時間以找到偏移量。

此外,如果服務器在同一時間執行一些不同的任務,則必須有一些延遲約10-15毫秒。如果傳輸本身沒有任何延遲,此操作的延遲必須與服務器內部延遲相同。我發現服務器也同時運行不同的任務,並有Max。由它們造成15毫秒的延遲。因此,在服務器上的總延遲是:在傳輸線+傳輸延遲其他任務

總延遲=服務器內部延遲+服務器內部延遲。