限制发送给WebSocket的数据速率

我们发送了大量的数据(从Node.js应用程序到Web浏览器)。

数据是blobsforms的二进制数据。

有时,最终用户的连接不好 – 在这种情况下,我们希望“跳过”消息(不要使用这些消息),并确保不会比用户可以接收更多的数据。

在服务器端,我们尝试过:

 function sendBlob(blob, socket) { console.log('socket.bufferedAmount: ' + socket.bufferedAmount); // Always zero if (socket.bufferedAmount > 0) { return; // Never called } socket.send(blob); } 

不幸的是bufferedAmount总是返回零。

这是正确的方式来看看有多less数据正在排队,但没有发送/收到的websockets,还是有更好的办法来实现这一目标?

(也尝试在客户端loginsocket.bufferedAmount ,但它也总是返回零)。

客户端(以及用于节点的ws模块)上存在的socket.bufferedAmount属性是它自己缓冲的字节数量,而不是远程的。 这意味着服务器上的socket.bufferedAmount意味着等待发送到客户端的多less个字节,而对于客户端而言,等待发送到服务器的是多less个字节。

你没有得到任何改变的原因是你的networking可能确实足以提供数据。 如果你真的想看到在socket.bufferedAmount的差异,那么试着限制你的浏览器networking访问。 这可以通过浏览器扩展或像NetLimiter这样的工具完成。

如果要通过跳过消息来节制连接,则可以考虑在客户端和服务器之间创build一些types的心跳系统。 有很多方法可以做到这一点,比如应用这个函数:

 setInterval(function() { if (socket.bufferedAmount == 0) { socket.send('heartbeat'); } }, 1000); 

然后通过计算时间间隔来检测错过的心跳。 这样做效率相当低,但还有其他方法可以做到这一点,例如响应从服务器发送的数据(尽pipe考虑到如果要在接收数据时发送心跳,心跳本身可能会受到限制或其他副作用) 。

如果您愿意切换到Socket.IO,还可以使用其他解决scheme。 它具有一个function,允许您发送易失性消息,即当客户端忙或因任何原因无法接受消息时丢弃的消息。

 var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { var timer = setInterval(function () { socket.volatile.emit('data', 'payload'); }, 100); socket.on('disconnect', function () { clearInterval(timer); }); }); 

请注意,您的应用程序中的Socket.IO将会更重,并且不会使用本地websocket协议。 当它是一个选项时它将使用websockets,但它是许多传输中的一个。 Socket.IO构build在Engine.IO上,它使用当前使用的模块的分支。

readonly属性bufferedAmount表示使用send()方法排队的UTF-8文本的字节数。

你的情况在这里显示你试图访问从服务器收到的消息。 所以bufferedAmount没有设置。