我正在尝试通过本地网络在浏览器和 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/