我正在尝试通过本地网络在浏览器和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
简直太奇怪了!
Date.now
不可靠答案 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
。