代码之家  ›  专栏  ›  技术社区  ›  Alex Michailidis

本地网络上的Websocket延迟

  •  0
  • Alex Michailidis  · 技术社区  · 7 年前

    我在本地网络上试验浏览器和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 latency 这在某种程度上是意料之中的。

    498 latency . 几乎半秒钟的时间来传递数据,这(在我看来)根本没有意义。我觉得应该低很多。。。

    -1422 latency 这简直太奇怪了!

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

    • SSL证书增加延迟
    • 错误的测量方法
    • Date.now
    0 回复  |  直到 7 年前
        1
  •  1
  •   Alex Michailidis    7 年前

    多亏了对这个问题的评论 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)
    })
    

    基本上,服务器将其时间戳发送给客户机,然后客户机将其发回。

    这样我就可以 5ms latency