Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: WebSocket php
Форумы портала PHP.SU » » HTTP и PHP » WebSocket php

Страниц (1): [1]
 

1. Joe - 16 Сентября, 2014 - 12:09:13 - перейти к сообщению
Есть WebSocket клиент (JavaScript) и сервер (php) есть ли способ наиболее точно получить время отклика сервера. Тоесть нужна цифра задержки. Можно конечно запоминать время при отправке и отнимать от цифры времени получения, но хотелось бы что-то более надежное.
2. OrmaJever - 16 Сентября, 2014 - 12:15:16 - перейти к сообщению
Joe пишет:
но хотелось бы что-то более надежное

а чем то что вы написали не надёжное?
3. Joe - 16 Сентября, 2014 - 12:49:29 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. var jSocket = function()
  2. {
  3.         var jWebSocket;
  4.         var time = ping = 0;
  5.        
  6.         // Запуск сокетов
  7.         this.run = function()
  8.         {
  9.                 jWebSocket = new WebSocket('ws://'+hostname+'/server/');
  10.                 jWebSocket.onopen = function() { jlog('Соединение установлено.'); };
  11.                 jWebSocket.onclose = function(event) { if (event.wasClean) jlog('Соединение закрыто чисто.'); else jlog('Обрыв соединения.'); jlog('Код: ' + event.code + ' причина: ' + event.reason); socket_restart(); };  
  12.                 jWebSocket.onmessage = function(r)
  13.                 {
  14.                         jlog('ping: ' + is_ping(false) );
  15.                        
  16.                         res = $.evalJSON(r['data']);
  17.                         if ( res ) sProcess(res);
  18.                 };
  19.                 jWebSocket.onerror = function(error) { jlog('Ошибка: '+error.message); };
  20.         }
  21.        
  22.         // Преобразование сообщения в строку понятную для сервера
  23.         this.code = function (type, obj) {
  24.                 var r = {}; r['mt'] = type; r['data'] = obj;
  25.                 var a = $.toJSON(r);
  26.                 return a;
  27.         }
  28.         //      Отправка сообщения на сервер
  29.         this.send = function (str) { is_ping(true); jWebSocket.send(str); }
  30.        
  31.         // Функция БОСС, раздача работы
  32.         function sProcess(res)
  33.         {
  34.                 switch (res['mt'])
  35.                 {
  36.                         case 1: Mod['chat'].send(res['data']); break; // чат
  37.                        
  38.                        
  39.                         default: jlog('Ошибка обработки полученных данных.'); break;
  40.                 }
  41.         }
  42.        
  43.         function socket_restart() { setTimeout('this.run();', 5000); }
  44.        
  45.         function is_ping( a )
  46.         {
  47.                 var d = new Date();
  48.                 if ( a == true ) time = d.getTime();
  49.                 else {
  50.                         ping = d.getTime()-time;
  51.                         return ping;
  52.                 }
  53.         }
  54.  
  55.        
  56. }

Получается что аптайм бывает и 1 милисекунда, как-то я в это не оч верю)
4. OrmaJever - 16 Сентября, 2014 - 15:17:58 - перейти к сообщению
ну вот смотрите, в функции this.send вы вызываете is_ping который записывает time, затем даже не успев отправить jWebSocket.send сервер вам отсылает какое-то сообщение, например на предыдущий ваш запрос или просто на сервере что-то поменялось и у вас получается 1мс.
Если вы хотите замерять реальный пинг то попробуйте слать какой-то аргумент, например то же время, то есть вы шлёте не
CODE (javascript):
скопировать код в буфер обмена
  1. jWebSocket.send(str);

а например
CODE (javascript):
скопировать код в буфер обмена
  1. jWebSocket.send(JSON.stringify({ping:time, data:str}));

и на сервере вы разбираете этот json, делаете что-то с data, а time отсылаете обратно в ответе.
Затем в jWebSocket.onmessage парсим json пришедший от сервера, и отнимаем текущее время от ping который вернул нам сервер. Это и будет время обработки запроса.
5. Joe - 16 Сентября, 2014 - 18:42:05 - перейти к сообщению
Спасибо) Воспользуюсь Вашим советом Улыбка

 

Powered by ExBB FM 1.0 RC1