2012-02-06 123 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毫秒的延迟。因此,在服务器上的总延迟是:在传输线+传输延迟其他任务

总延迟=服务器内部延迟+服务器内部延迟。