Странная задержка Websocket по локальной сети - PullRequest
0 голосов
/ 28 февраля 2019

Я экспериментировал с потоковой передачей звука в реальном времени между браузером и сервером 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, что как-то ожидается.

Теперь доступ к странице с мобильного телефона (на том же Wi-Fi) дает мне в среднем 498 latency.Почти полсекунды для передачи данных, что просто (на мой взгляд) не имеет смысла.Я думаю, что это должно быть намного ниже ...

Доступ к странице с ноутбуком Windows (опять же на том же Wi-Fi), дает -1422 latency, что просто странно!

Возможные проблемы (я так думаю)

  • SSL-сертификат добавляет задержку
  • Неправильный метод измерения
  • Date.now ненадежно

1 Ответ

0 голосов
/ 01 марта 2019

Благодаря комментариям вопроса кажется, что 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.

Таким образом, я получаю примерно 5ms latency между мобильным телефоном и компьютером (в том же Wi-Fi), что имеет смысл.

...