2009-02-02 22 views
13

我运行了几个游戏隧道服务器,并希望有一个页面,客户端可以在所有服务器上运行ping命令,并找出哪些响应最为敏感。据我所见,似乎没有正确的方法来做到这一点在JavaScript中,但我想,有没有人知道在闪光灯或其他客户端浏览器技术可能做到这一点?如何通过浏览器确定远程服务器的等待时间

+0

我对你的解决方案很感兴趣。有机会得到一些结果吗?提前致谢 ! – 2009-03-22 23:26:58

+0

对我来说最有趣的答案是Eliram的一个答案(http://stackoverflow.com/questions/503199/how-to-determine-latency-of-a-remote-server-through-the-browser/575542#575542 ),但StackOverflow已经为我选择了答案。尽管如此,我还没有做出这个计划。我不是flash dev – 2009-03-23 10:10:01

回答

17

大多数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请求,关键的是,每个服务器应该提供完全相同的资源(或者具有相同长度的资源)。服务器上的条件会影响响应时间,例如,如果一台服务器正在压缩数据,而另一台服务器则不是。
2

如果你正在谈论运行客户端的东西,我不确定这是可能的,由于安全原因。

也许你最好的选择是一个Java小程序 - 但这又需要根据本地安全策略进行检查。

如果我试着去想JS中的一些破解操作,也许你可以尝试发送一个异步请求和一个回调函数,它测量了它花费的毫秒数 - 但这只是我的头顶。

+0

我知道我可以做的一种方式是发送HEAD请求,但我更希望有一种方法可以使用闪存? – 2009-02-06 07:42:15

+0

Java小程序只允许联系其原始服务器。 – Magnar 2009-02-18 09:58:58

+0

如果他们已被签名并被接受,则允许具有更宽松安全性的小程序。或者至少他们曾经是。上次我看到一个是Netscape 4. – 2009-02-25 02:10:37

1

'文件坪'的问题是你会评估http服务器响应,而你服务的游戏的目标资源可能会有非常不同的行为,从而有不同的延迟。

只是一个想法,根据实际情况可能甚至是不切实际的: 但是,根据服务器在游戏过程中通常由服务器执行的一小段任务创建服务器脚本, (例如,打开一个RTMP连接,检索信息并将其发回)。根据服务器的总数,您几乎可以同时打开它们,并将第一个响应定义为赢者(减去客户端独立处理每个查询所需的时间)。

当然,这是一个相当昂贵的服务器端方法,但至少希望得到可靠的结果(总结服务器和网络延迟)。即使需要花费几秒钟的时间来评估,这也是总体愉快游戏的一小部分。

6

调用服务器之前,记录的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(); 
5

您真正需要的是从连接开始的时间,以时间第一个就绪状态改变...

 
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."); 
} 
2

在Flash中测量服务器响应时间并不难。

在访问远程服务器之前,Flash必须询问策略文件。 对于这样的策略文件的默认位置是在服务器的根文件夹:的/crossdomain.xml

(你可以很容易地找到有关跨域文件格式的信息)

由于需要无论如何,为什么不这样的文件用它来衡量服务器的响应时间?加载文件本身而不是图像,并测量使用getTimer()所花费的时间。

这会给你一个很好的HTTP连接评估。

但是,如果您正在处理游戏服务器,您可能需要直接检查TCP连接的速度。要做到这一点,您需要使用flash.net.Socket 您还需要先运行以下命令来请求策略文件: Security.loadPolicyFile(“xmlsocket://server.domain.com:5342”) ;

其中5342表示您的服务器的端口号,它应使用正确的XML策略字符串进行响应。 进行套接字连接后,任何请求/响应都会让您测量不同的服务器响应时间。

3

下面是一个方法:

http://magnetiq.com/exports/server_ping.png

有两列创建一个表(不一定是在字面意义上<table>)。第一列将保存服务器的名称(以及可能的链接)。第二列包含从相应服务器加载探测文档的iframe。每个探针文件执行此在初始读取请求:

  1. 获取当前系统时间
  2. 执行重定向(302)到第二探针文档,同时通过将系统时间作为查询参数
  3. 所述第二探针文档读取当前系统时间,从传递给它的初始读数计算增量,并以大字母显示。这个增量将是服务器用重定向响应加上客户端向重定向目标发出第二个请求所花费的时间来响应客户端的时间。这不完全是一个“平”,但它是客户端与每个服务器的相对延迟的可比较度量。事实上,这是从服务器到客户端的“反向ping”。

您会在不侵犯同域策略的情况下使用iframe,因为根本没有尝试操纵iframe内容。玩家只需用他/她自己的眼睛看到数值,然后您就可以依靠用户浏览数字并点击最有意义的服务器链接。

2

请记住,如果您最终使用TCP查询来测量延迟,则延迟将至少是ping的两倍,因为您需要三次握手和终止包至少(两次往返而不是一次)。如果您发出HTTP请求,请尽量减少标题。足够长的标题(由于服务器或客户端上的cookie等)可以增加额外的往返次数,从而抛弃测量结果。

相关问题