繁体   English   中英

删除数据包如果落后于Node JS中的Socket.IO

[英]Drop Packets If Falling Behind With Socket.IO in Node JS

我有一个实时感应应用程序,多个客户端,一个处理服务器。

我有一个问题,即我使用Socket.IO和NodeJS尽快将数据推送到客户端。 问题似乎是客户端从服务器上的发送器发送的传入数据开始堆叠,客户端落后(不同步)。

凭借足够的吞吐量,客户保持良好状态。 有没有什么办法可以强制执行一项策略,即服务器/客户端将丢弃超过指定时间段的任何发出?

数据被丢弃,客户端应该保持最新状态,所以我不担心丢失超过2秒的数据。

为了帮助可能遇到这个问题的其他人,我设计了一个锁定系统,以便服务器只在套接字空闲时发布数据。

这意味着服务器仍然尽可能快地发布,它只是不会堆叠多个传出数据请求。 请注意,这仅在您的消息丢失并且您需要最新信息时才有效。 这也意味着消息之间会有一些开销,因为客户端必须通知服务器它已经准备好了。

但是,这意味着我的应用程序仍然是最新的,并且不会因堆叠请求而落后,如果您在本地运行一个浏览器而在网络上运行另一个浏览器,这一点很明显。

Server.js

var socket = ...; // Create socket

// Create my data, in my project this updates very quickly
// roughly 60 times per second
var my_data = ...;

// Initially set receiving to false as the socket
// has no outgoing data
socket.set('receiving', false);

// Listen for received event, this indicates
// that the client has received an update
// and is now ready to receive more
socket.on('received', function() {
    socket.set('receiving', false);
});

// Function will be called repeatedly to send out data
function update() {
    // Check if the socket is receiving any data
    socket.get('receiving', function(receiving) {
        if(!receiving) {
            // Lock the socket from receiving future updates
            // by setting the receiving variable to true
            socket.set('receiving', true, function() {
                // Now emit data
                socket.emit('update', my_data);
            });
        }
    });

    setTimeout(update, 0); // Recursively call update
}
setTimeout(update, 0); // Start update

Client.js

var socket = io.connect();

socket.on('update', function(data) {
    // Store the data for processing

    // Tell the server we have received the data
    socket.emit('received');
});

发送易失性消息,如果无法发送则可以将其丢弃。 Socket.IO通常会跟踪客户端是否收到了消息,但是有了易失性消息,这个检查没有完成,Socket.IO进程可以继续,而不是等待:

socket.volatile.emit('event', data);

这是文档说明的内容:

这基本上是火和忘记功能,当客户端无法接收消息时,例如如果客户端有网络问题或者客户端使用轮询传输并且处于请求/响应周期的中间,这些消息不会在内部缓冲。

因此,如果您的客户端错过了几条消息或事件并不重要,您可能希望将这些消息或事件作为易失性消息发送。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM