socket.io 节点 js 上的数据发送事件

Data sent evet on socket.io nodejs

我有一个 nodejs 服务器,它通过网络套接字(使用 socket.io 和 socket.io-client)向网络客户端发送大量数据。

我正在尝试在处理低带宽客户端时优化我的系统,我的服务器生成数据的速度比我的客户端能够接收的数据快(由于其低带宽 link)。

为了优化我的系统,我需要知道我的客户是否已经阅读了上一条消息(然后我可以安全地发送另一条消息)或者它没有(然后我会聚合我的消息直到它会)。

socket.io或者nodejs有没有API可以让我知道这个信息?

P.S。 我已经尝试收听 engine.io 的 'drain' 事件,但它的级别太高(它无法判断客户端是否阅读了我的消息)。

emit 方法的第三个参数接受一个回调,该回调将传递给服务器,这样您就可以用您想要的任何数据调用确认。它实际上非常方便并且节省了配对呼叫响应事件的工作量。

我正在用我刚测试过的一些代码更新我的答案。

首先在服务器端

io.sockets.on('connection', function(sock){

console.log('Connected client');
sock.emit('connected', {connected:'Yay!'});

// 客户端将 'callback' 作为函数传递。当我们在服务器上调用回调时 // 客户端的代码将 运行

sock.on('testmessage', function(data, callback){
    console.log('Socket (server-side): received message:', data);
    var responseData = { string1:'I like ', string2: 'bananas ', string3:' dude!' };
    //console.log('connection data:', evData);
    callback(responseData);
});

});

在客户端:

console.log('starting connection...');
var socket = io.connect('http://localhost:3000');
socket.on('error', function(evData){
    console.error('Connection Error:',evData);
});

// 'connected' 是我们的自定义消息,让我们知道用户已连接

socket.on('connected', function (data) {
    console.log('Socket connected (client side):', data);

    // Now that we are connected let's send our test call with callback
    socket.emit('testmessage', {payload:'let us see if this worketh'}, function(responseData){
        console.log('Callback called with data:', responseData);
    });
});