Websocket在本地网络上的奇怪延迟

时间:2019-02-27 21:36:36

标签: node.js ssl networking websocket latency

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

在这里变得奇怪。

// 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 latency都可以访问同一台计算机上的页面,这在某种程度上是可以预期的。

现在使用手机(在同一个wifi上)访问该页面平均可以给我498 latency。将近半秒才能传递数据,这(在我看来)根本没有意义。我认为应该低得多...

使用Windows笔记本电脑(同样使用wifi)访问该页面,得到-1422 latency简直太奇怪了!

可能的问题(我认为)

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

1 个答案:

答案 0 :(得分:0)

由于对该问题的评论,看来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中)大约得到了5ms latency