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