node.js - 本地网络上的 Websocket 奇怪延迟

标签 node.js ssl networking websocket latency

我正在尝试通过本地网络在浏览器和 nodejs 服务器之间进行实时音频流传输,但遇到了一些延迟。因为这是一项“繁重”的工作,所以我已经预料到了这一点,所以我尝试传递一些简单的数据并测量正常延迟。

这就是奇怪的地方。

// server.js

const https = require('https')
const WebSocket = require('ws');

const websocketListener = (ws) => {
  ws.on('message', function incoming(message) {
    console.log(`At ${Date.now()} received ${message} latency ${Date.now() - +message}`)
  });
}

const httpListener = (req, res) => {
  if (req.url === '/' && req.method === 'GET') {
    return fs.createReadStream('./index.html').pipe(res)
  } else {
    res.end('NOT found')
  }
}

const server = https.createServer({
  key: fs.readFileSync('./server.key'),
  cert: fs.readFileSync('./server.cert')
}, httpListener)

new WebSocket.Server({server}).on('connection', websocketListener);

server.listen({ host: '192.168.1.12', port: 1338 })
// index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <script>
    const socket = new WebSocket(`wss://${location.host}/`);

    socket.addEventListener('open', function(event) {
      setInterval(() => {
        socket.send(Date.now())
      }, 100)
    });
  </script>
</body>

</html>

在同一台计算机上访问该页面几乎每次都会给我 0 延迟,这在某种程度上是意料之中的。

现在用手机访问页面(在同一个 wifi 上)平均 498 延迟。将近半秒的时间来传递数据,这根本(在我看来)没有意义。我认为应该低得多...

使用 Windows 笔记本电脑访问该页面(同样在同一个 wifi 上)会产生 -1422 延迟,这简直太奇怪了!

可能的问题(我能想到的)

  • SSL 证书增加了延迟
  • 错误的测量方法
  • Date.now 不可靠

最佳答案

感谢问题的评论,Date.now 在不同系统之间似乎不可靠。两台计算机不会有相同的时间(以毫秒为单位)。

作为估算延迟时间的变通方法,我使用了这段代码。 (同样,在问题评论的帮助下)

// server.js

const websocketListener = (ws) => {
    setInterval(() => {
        ws.send(Date.now())
    }, 100)
    ws.on('message', function incoming(message) {
        console.log(`Latency ${(Date.now() - +message) / 2}`)
    });
}
// index.html

socket.addEventListener('message', (msg) => {
  socket.send(msg.data)
})

基本上服务器将其时间戳发送给客户端,然后客户端将其发回。 然后服务器简单地用消息中的时间减去当前时间,然后除以 2。

这样我就可以在移动设备和计算机(在同一 wifi 中)之间获得大约 5 毫秒的延迟,这是有道理的。

关于node.js - 本地网络上的 Websocket 奇怪延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54914866/

相关文章:

node.js - 如何读取 Azure Blob URL?

node.js - 为什么 connect-mongo 为每个请求创建新 session ?

c++ - 在 Qt 5.2.1 上编写的 SSL 服务器的 SSL 握手失败

html - 通过 HTTPS 获得的 CSS 中的 HTTP 请求

linux - 如何从证书文件(.crt 扩展名)生成证书请求和私钥文件(.pem 扩展名)

C# Http服务器使用StreamSocketListener,选项 "InputStreamOptions.Partial"返回数据不完整

android - 我的 Android 应用程序上的 VOIP

node.js - 在 docker 容器上运行 nodejs 应用程序会给出 "Error: Cannot find module '/usr/src/app/nodemon' "

JavaScript,随机数的 Mocha 测试

TCP 写入连接超时(netstat 显示 ESTABLISHED)