Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-测量打开到服务器的tcp连接的时间_Javascript_Sockets_Tcp - Fatal编程技术网

Javascript-测量打开到服务器的tcp连接的时间

Javascript-测量打开到服务器的tcp连接的时间,javascript,sockets,tcp,Javascript,Sockets,Tcp,我想测量打开(和关闭)到服务器的tcp连接的延迟我不想发送/接收任何数据,因为我希望尽可能减少开销,以消除服务器端增加请求时间的任何问题 把它想象成TCP ping。记录当前时间,连接到主机:端口,断开连接,计算增量时间 我相信Javascript不允许打开直接套接字,但我希望考虑到它的功能(例如AJAX请求),它可以以某种形式使用,以满足我的需求 编辑: 有关服务器的一些信息: 这是一个远程服务器,所以我需要能够处理关于同一来源的错误 它不是标准的Web服务器,不支持HEAD(这就是为什么我

我想测量打开(和关闭)到服务器的tcp连接的延迟我不想发送/接收任何数据,因为我希望尽可能减少开销,以消除服务器端增加请求时间的任何问题

把它想象成TCP ping。记录当前时间,连接到主机:端口,断开连接,计算增量时间

我相信Javascript不允许打开直接套接字,但我希望考虑到它的功能(例如AJAX请求),它可以以某种形式使用,以满足我的需求

编辑:

有关服务器的一些信息:

  • 这是一个远程服务器,所以我需要能够处理关于同一来源的错误
  • 它不是标准的Web服务器,不支持HEAD(这就是为什么我只想打开连接而不发送数据)
  • 如果我尝试GET请求,它会重置连接

即使我可以尝试一个连接,然后由于以上几点而被拒绝,如果我可以捕获异常,我仍然可以使用它已连接的事实来确定延迟。

由于我们在应用层内部运行,我们只能通过HTTP进行延迟测试

var xhr = new XMLHttpRequest()
xhr.open("HEAD", "/", false)
console.time("latency");
xhr.send();
console.timeEnd("latency");
代码说明:

我创建了一个对当前主机的同步AJAX请求。我使用了
“HEAD”
作为方法,它非常轻量级,不接收任何内容。因此,我们可以假设“HEAD”请求的往返非常接近ICMP或TCP上的实际ping

对于URL,使用
“/”
(当前主机)。由于同源策略,除非您被允许,否则您不能仅使用任何类似的域

我使用
console.time()
console.timeEnd()
来测量持续时间,这比使用常规的
日期更准确。但是,您也可以使用
Date
测量持续时间:

//...
var now = (new Date()).getTime()
xhr.send();
var duration = (new Date()).getTime() - now; //ms
更新: 即使发生异常,也请尝试以下代码来测量延迟:

try {
    var xhr = new XMLHttpRequest()
    xhr.open("HEAD", "http://google.com" + "/?" + Math.random(), false) 
    console.time("latency");
    xhr.send();
}
catch (e){
    //block exception
}
finally {
    console.timeEnd("latency");
}

请注意,我还在URL末尾添加了一个随机数,以防止浏览器缓存。

这几乎是理想的,不幸的是,它是一个远程服务器,不支持HEAD(尽管如果我能捕捉到这个错误,也可以)。我将更新我的帖子,提供有关服务器的更多信息。请求/定时捕获工作正常,但由于同源策略,似乎没有办法抑制/捕获“XMLHttpRequest无法加载..”错误。我已在Chrome和Firefox中测试过,无论出现任何错误,它都能正常工作。例如,我去msn.com,在开发者工具中运行代码(向google.com发送请求),它正确地给出了持续时间。