2012-02-06 6 views
0

У меня есть вопрос относительно передачи данных с сервера - клиента. Данные отправляются клиентом после выполнения простого протокола. Но я обнаружил, что на стороне сервера есть задержка. Клиент и сервер тестируются на том же ПК, который имеет ядро ​​i5 с SSD и 8 ГБ оперативной памяти.Задержка на стороне сервера

То, как я измерил задержку, после того, как клиенты говорят «Отправка», обе стороны записывают текущее системное время в миллисекундах. Сами данные - это текущее системное время, отправленное клиентом. Сервер проверяет, насколько он задерживается на стороне сервера. Он начинается с 0 мс и увеличивается до 90 мс и стабилизируется в течение 40 мс. Интересно, что эта задержка нормальная.

Вот код сервера (многопоточный):

....  
     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

ОК, ** есть проблема с производительностью в Double.parseDouble() в цикле while(). ** Я удалил этот код и изменил его на saveSvr.write (inputLine) и сравнил их в другом проекте. Они идентичны и нет задержки. – user1098761

+1

Если это действительно решило вашу проблему, отправьте ее как ответ, а также убедитесь, что _accept_ это когда угодно. –

ответ

0

Это код должен быть удален из цикла while(). Это приводит к массивному трафику процессора и задержке на стороне сервера.

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

Вместо этого, если кому-то нужен для сравнения на стороне сервера по местному времени с клиентом по местному времени, используйте пинг друг друга первый затем сохранить их местное время в начале передачи затем сохранить как на сервере.

Если в ступице нет задержки, пинг будет указывать Макс. 1 мс и оба локальных времени должны быть одинаковыми.

Конечно, местное время клиента должно быть скорректировано в зависимости от времени сервера; поэтому нам нужно сохранить свое местное время в начале передачи, чтобы найти смещение.

Кроме того, если сервер выполняет несколько разных задач одновременно, должна быть отложена примерно 10-15 мс. Если сама передача не имеет какой-либо задержки, Макс. Задержка этой операции должна быть идентична внутренней задержке сервера. Я обнаружил, что сервер одновременно запускал разные задачи и имел Макс. Задержка в 15 мс, вызванная ими. Таким образом, общая задержка на сервере равна:

Общая задержка = внутренняя задержка сервера на другие задачи + внутренняя задержка сервера на потоке передачи + задержка передачи.

Смежные вопросы