如何确保通过socket.io的消息已被接收到客户端?

如何检查与socket.io库发送的消息已被接收到客户端。 在socket.io中是否有特殊的方法?

感谢您的回答!

您应该在定义事件处理程序时使用callback参数。

一个典型的实现将如下所示:

客户端

var socket = io.connect('http://localhost'); socket.emit('set', 'is_it_ok', function (response) { console.log(response); }); 

服务器端

 io.sockets.on('connection', function (socket) { socket.on('set', function (status, callback) { console.log(status); callback('ok'); }); }); 

现在检查服务器端的控制台。 它应该显示“is_it_ok”。 接下来检查客户端的控制台。 它应该显示“OK”。 这是确认信息。

更新

一个socket.io连接基本上是持久的。 以下内置函数可让您根据连接状态采取行动。

 socket.on('disconnect', function() {} ); // wait for reconnect socket.on('reconnect', function() {} ); // connection restored socket.on('reconnecting', function(nextRetry) {} ); //trying to reconnect socket.on('reconnect_failed', function() { console.log("Reconnect failed"); }); 

使用上面显示的callback选项实际上是以下两个步骤的组合:

 socket.emit('callback', 'ok') // happens immediately 

并在客户端

 socket.on('callback', function(data) { console.log(data); }); 

所以你不需要使用计时器。 除非连接具有以下任何状态 – “disconnect”,“reconnecting”,“reconnect_failed”,否则该callback将立即运行。

你可以使用socket.io的确认。

从socket.io文档引用:

有时候,当客户确认信息接收时,你可能想要得到一个回叫。

要做到这一点,只需传递一个函数作为.send.emit的最后一个参数。 更重要的是,当你使用.emit ,确认是由你完成的,也就是说你也可以传递数据。

在客户端简单地发送事件与您的数据,该函数将被调用,只要服务器响应您的事件:

 client.emit("someEvent", {property:value}, function (data) { if (data.error) console.log('Something went wrong on the server'); if (data.ok) console.log('Event was processed successfully'); }); 

在服务器端,您将使用数据和callback句柄来调用以发送响应:

 socket.on('someEvent', function (data, callback) { // do some work with the data if (err) { callback({error:'someErrorCode', msg:'Some message'}); return; } callback({ok:true}); }); 

当添加一个函数作为.send().emit()方法调用的最后一个参数时,当对方收到消息时调用此函数。

 socket.send('hi', function() { // if we are here, our salutation has been received by the other party. });