Javascript 速率限制通过WebSocket发送的数据

Javascript 速率限制通过WebSocket发送的数据,javascript,node.js,websocket,Javascript,Node.js,Websocket,我们通过websocket(从Node.js应用程序到web浏览器)发送大量数据 数据是二进制数据,形式为blob 有时,最终用户的连接很差——在这种情况下,我们希望“跳过”消息(将其忽略),并确保我们不会塞满用户无法接收的数据 在服务器端,我们尝试了: function sendBlob(blob, socket) { console.log('socket.bufferedAmount: ' + socket.bufferedAmount); // Always zero if (

我们通过websocket(从Node.js应用程序到web浏览器)发送大量数据

数据是二进制数据,形式为
blob

有时,最终用户的连接很差——在这种情况下,我们希望“跳过”消息(将其忽略),并确保我们不会塞满用户无法接收的数据

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

function sendBlob(blob, socket) {
  console.log('socket.bufferedAmount: ' + socket.bufferedAmount); // Always zero

  if (socket.bufferedAmount > 0) {
    return; // Never called
  }

  socket.send(blob);
}
不幸的是,
bufferedAmount
总是返回零

这是查看有多少数据正在排队但未在WebSocket中发送/接收的正确方法,还是有更好的方法来实现这一点


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

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

您的案例显示,您正试图通过从服务器收到的消息访问它。
因此未设置
bufferedAmount
socket.bufferedAmount
属性存在于客户端(以及节点的模块)上,是它本身缓冲的字节数,而不是远程缓存。这意味着
socket。服务器上的bufferedAmount
表示等待发送到客户端的字节数,而对于客户端,则表示等待发送到服务器的字节数

您没有在属性中得到任何更改的原因是您的网络可能确实足以交付数据。如果您确实希望看到socket.bufferedAmount中的差异,请尝试限制您的浏览器网络访问。这可以通过浏览器扩展或类似的工具来实现

如果希望通过跳过消息来限制连接,可以考虑在客户端和服务器之间创建某种类型的心跳系统。有很多方法可以实现这一点,例如应用此函数:

setInterval(function() {
  if (socket.bufferedAmount == 0) {
    socket.send('heartbeat');
  }
}, 1000);
然后通过计算时间间隔来检测错过的心跳。这是相当低效的,但也有其他方法可以做到这一点,例如响应服务器发送的数据(尽管要考虑到,如果在接收数据时要发送心跳信号,心跳信号本身可能会被抑制或产生其他副作用)

如果您愿意切换到,也可以使用其他解决方案。它有一个功能,允许您发送易失性消息,如果客户端忙或由于任何原因无法接受消息,这些消息将被删除

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协议。当它是一个选项时,它将使用WebSocket,但它是许多传输之一。Socket.IO构建在Engine.IO上,Engine.IO使用了您当前使用的模块的一个分支。

您认为实现预期结果的最佳方法是什么?您可能会对e.data.length施加一些条件。除了限制数据量,我还需要评估数据是否“卡住”,并修改动态发送的数据量。我可以设置一个PID控制器(或类似的)。我只需要弄清楚在连接速度较慢的情况下,要跟踪哪些指标会增加。您使用的是哪台服务器端websocket服务器?(版本0.4.30)。谢谢谢谢你详细的回答!我们使用的是Socket IO,但现在需要发送二进制数据,从而切换到本机WebSocket。我一直在用Mac电脑上的网络链接调节器进行测试,虽然连接速度明显慢了很多,但服务器端的
bufferedAmount
似乎保持在零。你必须限制服务器的连接,而不是客户端,服务器的
bufferedAmount
才能增加。啊。。我懂了。那么,当大部分数据从服务器传输到客户端时,有没有办法判断客户端的连接是否很慢?据我所知,没有,这就是我在文章中概述的客户端心跳可以工作的地方。如果
bufferedAmount
大于零,客户端将不会在该间隔内发送心跳信号。