Как определить задержку удаленного сервера через браузер

Операции с индексированными транзакциями фиксируются, как только последний обратный вызов запускается, поэтому способ сохранить их в живых - это передать их через обратные вызовы.

Я просматриваю свою информацию о транзакции от Jonas Sicking, Mozilla dev и co-spec writer для IndexedDB, которые комментировали этот отличный пост в блоге , чтобы сказать следующее:

Следующее предложение неверно ». Сегодня транзакции, commit, когда переменная транзакции выходит за пределы области видимости и больше не может быть помещено против нее ».

Транзакция никогда автоматически не фиксируется, когда переменная выходит за пределы области видимости. Обычно они фиксируются только тогда, когда срабатывает последний обратный вызов успеха / ошибки, и этот обратный вызов не рассылает больше запросов. Таким образом, это не связано с объемом каких-либо переменных.

Единственное исключение - создание транзакции, но не обращение к ней. В этом случае транзакция «совершена» (независимо от того, что означает транзакцию, которая не имеет запросов), как только вы вернетесь в цикл событий. В этом случае вы можете технически «зафиксировать» транзакцию, как только все ссылки на нее выйдут из области видимости, но оптимизировать ее не рекомендуется.

blockquote>

13
задан Mladen Mihajlovic 6 February 2009 в 07:41
поделиться

8 ответов

Большая часть технологии апплета, включая JavaScript, осуществляет политику того-же-источника. Может быть возможно динамично добавить элементы DOM, такие как изображения, и собрать информацию синхронизации с помощью обработчика событий onLoad.

Psuedo-код

for (server in servers) {
  var img = document.createElement('IMG');
  server.startTime = getCurrentTimeInMS();
  img.onload=function() { server.endTime = getcurrentTimeInMS(); }
  img.src = server.imgUrl;
}

Затем ожидает подходящее время и проверяет синхронизацию на каждый серверный объект. Повторитесь по мере необходимости и вычислите средние числа, если Вы хотите. Я не уверен, какую точность можно ожидать.

Недостатки:

  • Вы, вероятно, используете неправильный инструмент для задания. Браузер не оборудован для этого вида приложения.
  • Это, вероятно, довольно неточно.
  • , Если ресурс Вы запрашиваете, кэшируется, он не даст Вам результаты, которые Вы хотите, но можно работать вокруг этого путем изменения URL каждый раз.
  • Это интенсивно пропускной способностью по сравнению с нормальным ping. Сделайте изображение крошечным, такое как spacer.gif файл.
  • синхронизация зависит не только от задержки удаленного сервера, но и пропускной способности того сервера. Это может быть более или менее полезной мерой, но важно отметить, что это не просто задержка.
  • необходимо смочь вручить Запросы HTTP с различных серверов и, кардинально, каждый сервер должен служить тому же самому ресурсу (или ресурсу той же длины). Условия на сервере могут влиять на время отклика, такой, как будто один сервер сжимает данные, и другой не.
17
ответ дан Mr. Shiny and New 安宇 6 February 2009 в 17:41
поделиться
  • 1
    Идет. См. мой ответ, который использует тип от Системы. Наборы. Параллельное пространство имен. – mellamokb 17 February 2011 в 04:28

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

, Возможно, Ваш лучший выбор был бы апплетом Java - но снова это должно быть проверено по политике локальной защиты.

, Если я пытаюсь думать о некотором взломе в JS, чтобы сделать это, возможно, можно попытаться отправить асинхронный запрос с функцией обратного вызова, которая измеряет миллисекунды, которые это взяло - но это просто первое, что пришло на ум.

2
ответ дан Yuval Adam 6 February 2009 в 17:41
поделиться

Перед вызовом к серверу запишите время JavaScript:

var startTime = new Date();

Загрузка изображение с сервера:

var img = new Image()
img.onload = function() {
    // record end time
}
img.src = "http://server1.domain.com/ping.jpg";

, Как только запрос закончен, запись время снова. (Данный, конечно, что запрос убрал не время.)

var endTime = new Date();

Ваш ping в миллисекундах:

var ping = endTime. getTime() - startTime.getTime();
8
ответ дан Georg Schölly 6 February 2009 в 17:41
поделиться

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

function getPing() {
  var start;
  var client = getClient(); // xmlhttprequest object
  client.onreadystatechange = function() {
    if (client.readyState > 0) {
      pingDone(start); //handle ping
      client.onreadystatechange = null; //remove handler
    } 
  }

  start = new Date();
  client.open("HEAD", "/ping.txt"); //static file
  client.send();
}

function pingDone(start) {
  done = new Date();
  ms = done.valueOf() - start.valueOf();
  alert(ms + "ms ping time");
}

function getClient() {
  if (window.XMLHttpRequest)
    return new XMLHttpRequest();

  if (window.ActiveXObject)
    return new ActiveXObject('MSXML2.XMLHTTP.3.0');

  throw("No XMLHttpRequest Object Available.");
}
6
ответ дан Tracker1 6 February 2009 в 17:41
поделиться

Проблема с 'ping файла' состоит в том, что Вы оценили бы http ответ сервера, тогда как Ваш целевой ресурс для игр, которым Вы служите, может иметь совсем другое поведение и таким образом другую задержку.

Просто идея внезапно, возможно, даже нереалистичный в зависимости от фактического контекста: но, не был бы это быть интересным сделать сценарий сервера на основе короткой последовательности задач обычно выполняемым серверами во время геймплея (например, открытие соединения RTMP, получая информацию, передавая его обратно). В зависимости от общего количества серверов Вы могли, почти открывая их одновременно и определять первый ответ как победителя (вычитающий время, которого Ваш клиент требует независимо для обработки каждого запроса).

, Конечно, это - довольно дорогой разговор стороны сервера метода, но по крайней мере Вы, надо надеяться, получили бы надежный результат (сервер и сетевые задержки, которым подводят итог). Даже если бы это берет пару секунд для оценки, это было бы вопросом части общего приятного геймплея.

1
ответ дан Theo.T 6 February 2009 в 17:41
поделиться
  • 1
    C99 позволяет Вам использовать так называемый ' обозначенный initializers' инициализировать составные типы (массивы, объединения, структуры). Синтаксис .member = expression. – Michael Foukarakis 10 June 2011 в 11:08

Дело не в этом трудно для измерения времени отклика сервера в Flash.

Flash должен попросить файл политики прежде, чем получить доступ к удаленным серверам. Местоположение по умолчанию для такого файла политики в корневой папке сервера: /crossdomain.xml

(Можно легко найти информацию о междоменном формате файла)

Начиная с такого файла необходим так или иначе, почему бы не использовать его для измерения времени отклика сервера? Загрузите сам файл вместо изображения и измерьте время, он взял использование getTimer ().

Это даст Вам хорошую оценку на HTTP-соединениях.

, Но если Вы имеете дело с игровыми серверами, Вы могли бы хотеть непосредственно проверить скорость соединения TCP. Чтобы сделать это, необходимо будет использовать flash.net. Сокет необходимо будет также попросить файл политики сначала путем выполнения: Security.loadPolicyFile ("xmlsocket://сервер domain.com:5342");

, Где 5342 представляет номер порта Вашего сервера, где он должен ответить надлежащей строкой политики XML. После создания сокетного соединения любой запрос/ответ позволит Вам измерить различное время отклика сервера.

2
ответ дан Eliram 6 February 2009 в 17:41
поделиться
  • 1
    это интересно. I' m незнакомый с этим синтаксисом " структура DelayClass задерживается = {.delay = 10, .ops = & операции}; " Вы могли объяснить точечный синтаксис здесь. – dubbeat 10 June 2011 в 11:00

Вот <iframe> подход:


(источник: magnetiq.com )

Составляют таблицу (не обязательно в литерале <table> смысл) с двумя столбцами. Первый столбец будет содержать название серверов (и возможно связывается с ними). Второй столбец имеет iframes, которые загружают тестовые документы из соответствующих серверов. Каждый тестовый документ делает это по начальному запросу выборки:

  1. Добираются, текущее системное время
  2. Делают перенаправление (302) к второму тестовому документу при передаче системного времени как параметра запроса
  3. , второй тестовый документ читает текущее системное время, вычисляет дельту от начальной буквы, читая, который был передан ему и просто отображает его в больших буквах. Эта дельта будет временем, которое потребовалось, чтобы сервер ответил клиенту с ответом перенаправления плюс время, которое потребовалось, чтобы клиент выполнил второй запрос к цели перенаправления. Это не точно "ping", но это - сопоставимая мера относительной задержки клиента с каждым сервером. На самом деле это - "обратный ping" от сервера до клиента.

Вы использовали бы iframes, не нарушая ту-же-доменную-политику, потому что нет никакой попытки управления iframe содержанием вообще. Игрок будет просто видеть значения его собственными глазами, и Вы будете полагаться на пользователя, глядящего на числа и нажимающего на ссылку сервера, которая имеет большую часть смысла.

3
ответ дан Glorfindel 6 February 2009 в 17:41
поделиться

Следует иметь в виду, что задержка будет по крайней мере дважды, какого Вы видели бы ping, если Вы заканчиваете тем, что делали запрос TCP для измерения задержки, потому что Вам будут нужны трехэтапное квитирование и пакет завершения в минимуме (два распространения в прямом и обратном направлениях, а не одно). При создании Запросов HTTP попытайтесь свести заголовки к минимуму. Достаточно длинный заголовок (из-за болтливого сервера или cookie и т.д. на клиенте) может добавить дополнительные распространения в прямом и обратном направлениях в соединение, отбросив Ваши измерения.

3
ответ дан Peter Burns 6 February 2009 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: