我运行了几个游戏隧道服务器,并希望有一个页面,客户端可以在所有服务器上运行ping,并找出响应最快的服务器.据我所知,似乎没有正确的方法在JavaScript中执行此操作,但我在想,是否有人知道在Flash或其他一些客户端浏览器技术中执行此操作的方法?
大多数applet技术(包括Javascript)都强制执行同源策略.可以动态添加DOM元素(例如图像),并使用onload事件处理程序收集定时信息.
伪代码
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请求,并且至关重要的是,每个服务器应该提供完全相同的资源(或相同长度的资源).服务器上的条件可能会影响响应时间,例如,如果一个服务器正在压缩数据而另一个服务器没有.
在调用服务器之前,记录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();
您真正需要的是从连接开始到第一次状态变化的时间......
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."); }