javascript - significado - Cómo determinar la latencia de un servidor remoto a través del navegador
que es el ping en fortnite (8)
Si está hablando de ejecutar algo del lado del cliente, no estoy seguro de que esto sea posible debido a razones de seguridad.
Tal vez su mejor opción sea un applet de Java, pero una vez más, esto debe verificarse con la política de seguridad local.
Si trato de pensar en algún truco en JS para hacer esto, tal vez puedas intentar enviar una solicitud asíncrona con una función de devolución de llamada que mida los milisegundos que tomó, pero esto está fuera de mi cabeza.
Tengo un par de servidores de túnel de juego y me gustaría tener una página donde el cliente pueda ejecutar un ping en todos los servidores y descubrir cuál es el más receptivo. Por lo que puedo ver, parece que no hay una forma adecuada de hacer esto en JavaScript, pero estaba pensando, ¿alguien sabe de una manera de hacer esto en flash o alguna otra tecnología de navegador de cliente?
La mayoría de la tecnología de applet, incluido Javascript, impone una política de origen idéntico. Puede ser posible agregar dinámicamente elementos DOM, como imágenes, y recopilar información de tiempo utilizando el controlador de eventos onload.
Código Psuedo
for (server in servers) {
var img = document.createElement(''IMG'');
server.startTime = getCurrentTimeInMS();
img.onload=function() { server.endTime = getcurrentTimeInMS(); }
img.src = server.imgUrl;
}
Luego espere un momento apropiado y verifique el tiempo para cada objeto del servidor. Repita según sea necesario y calcule los promedios si lo desea. No estoy seguro de qué tipo de precisión puede esperar.
Desventajas:
- Probablemente estés usando la herramienta incorrecta para el trabajo. Un navegador no está equipado para este tipo de aplicación.
- Probablemente sea bastante inexacto.
- Si el recurso que solicita está en caché, no le dará los resultados que desea, pero puede solucionarlo cambiando la URL cada vez.
- Esto es intensivo en ancho de banda en comparación con un ping normal. Haga que la imagen sea pequeña, como un archivo spacer.gif.
- El tiempo depende no solo de la latencia del servidor remoto sino también del ancho de banda de ese servidor. Esta puede ser una medida más o menos útil, pero es importante tener en cuenta que no es simplemente la latencia.
- Debe poder atender las solicitudes HTTP de los distintos servidores y, lo que es más importante, cada servidor debe servir exactamente el mismo recurso (o un recurso de la misma duración). Las condiciones en el servidor pueden afectar el tiempo de respuesta, como si un servidor está comprimiendo los datos y otro no.
Antes de la llamada al servidor, registre el tiempo de Javascript:
var startTime = new Date();
Cargue una imagen del servidor:
var img = new Image()
img.onload = function() {
// record end time
}
img.src = "http://server1.domain.com/ping.jpg";
Tan pronto como la solicitud finalice, registre la hora nuevamente. (Dado que, por supuesto, la solicitud no expiró).
var endTime = new Date();
Su ping en milisegundos es:
var ping = endTime. getTime() - startTime.getTime();
El problema con ''pings de archivos'' es que evaluarías la respuesta del servidor http mientras que tu recurso objetivo para los juegos que sirves puede tener un comportamiento muy diferente y por lo tanto una latencia diferente.
Solo una idea inesperada, tal vez incluso poco realista según el contexto real: pero, ¿no sería interesante hacer un script de servidor basado en una secuencia corta de tareas ejecutadas típicamente por los servidores durante el juego (por ejemplo, abrir un RTMP)? conexión, recuperar una información, enviarla de vuelta). Dependiendo de la cantidad total de servidores, casi podría abrirlos simultáneamente y definir la primera respuesta como ganadora (restando el tiempo que su cliente requiere de manera independiente para procesar cada consulta).
Por supuesto, este es un método bastante caro para hablar en el servidor, pero al menos se espera que obtenga un resultado confiable (las latencias del servidor y la red se resumen). Incluso si toma un par de segundos para evaluar, esta sería la cuestión de una fracción del total juego agradable.
Todo lo que realmente necesita es el tiempo desde el inicio de la conexión hasta el momento del primer cambio de estado preparado ...
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."); }
No es tan difícil medir el tiempo de respuesta del servidor en Flash.
Flash debe solicitar un archivo de política antes de acceder a los servidores remotos. La ubicación predeterminada para dicho archivo de política se encuentra en la carpeta raíz del servidor: /crossdomain.xml
(Puede encontrar fácilmente información sobre el formato de archivo de dominio cruzado)
Dado que dicho archivo es necesario de todos modos, ¿por qué no usarlo para medir el tiempo de respuesta del servidor? Cargue el archivo en sí mismo en lugar de una imagen y mida el tiempo que tomó usando getTimer ().
Esto le dará una buena estimación de las conexiones HTTP.
Pero si se trata de servidores de juegos, es posible que desee verificar directamente la velocidad de la conexión TCP. Para hacer eso, necesitará usar flash.net.Socket. También deberá solicitar primero un archivo de política ejecutando: Security.loadPolicyFile ("xmlsocket: //server.domain.com: 5342");
Donde 5342 representa el número de puerto de su servidor donde debería responder con la cadena de política XML adecuada. Después de realizar la conexión de socket, cualquier solicitud / respuesta le permitirá medir diferentes tiempos de respuesta del servidor.
Aquí hay un enfoque de <iframe>
:
http://magnetiq.com/exports/server_ping.png
Cree una tabla (no necesariamente en el sentido literal de <table>
) con dos columnas. La primera columna contendrá el nombre de los servidores (y posiblemente enlaces a ellos). La segunda columna tiene iframes que cargan documentos de prueba de los servidores respectivos. Cada documento de sonda hace esto en la solicitud de obtención inicial:
- Obtenga la hora actual del sistema
- Realice una redirección (302) a un segundo documento de sonda mientras pasa la hora del sistema como un parámetro de consulta
- El segundo documento de la sonda lee la hora actual del sistema, calcula el delta de la lectura inicial que se le pasó y simplemente lo muestra en letras grandes y gruesas. Este delta será el tiempo que le tomó al servidor responder al cliente con una respuesta de redirección más el tiempo que tardó el cliente en realizar la segunda solicitud al objetivo de redireccionamiento. No es exactamente un "ping", pero es una medida comparable de la latencia relativa del cliente con cada servidor. De hecho, es un "ping inverso" del servidor al cliente.
Utilizaría iframes sin infringir la política del mismo dominio porque no hay ningún intento de manipular el contenido del iframe. El jugador simplemente verá los valores con sus propios ojos y se basará en que el usuario eche un vistazo a los números y haga clic en el enlace del servidor que tenga más sentido.
Tenga en cuenta que la latencia será al menos el doble de lo que vería si hace un ping si termina haciendo una consulta TCP para medir la latencia, porque necesitará el protocolo de tres vías y el paquete de terminación como mínimo ( dos viajes redondos en lugar de uno). Si realiza solicitudes HTTP, intente mantener los encabezados al mínimo. Un encabezado lo suficientemente largo (debido a un servidor hablador, o cookies, etc. en el cliente) puede agregar viajes de ida y vuelta adicionales en la mezcla, arrojando sus mediciones.