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

Bar*_*art 16 javascript websocket node.js socket.io

如何检查已通过socket.io库发送的消息已收到客户端.在socket.io中有没有特殊的方法?

谢谢你的回答!

alm*_*pal 27

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

典型的实现如下:

客户端

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

服务器端

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

现在检查服务器端的控制台.它应该显示'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"); });
Run Code Online (Sandbox Code Playgroud)

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

socket.emit('callback', 'ok') // happens immediately
Run Code Online (Sandbox Code Playgroud)

并在客户端

socket.on('callback', function(data) {
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

所以你不需要使用计时器.回调立即运行,除非连接具有以下任何状态 - 'disconnect','reconnecting','reconnect_failed'.


小智 7

您可以使用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');
});
Run Code Online (Sandbox Code Playgroud)

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

socket.on('someEvent', function (data, callback) {

  // do some work with the data

  if (err) {
    callback({error:'someErrorCode', msg:'Some message'});
    return;
  }

  callback({ok:true});
});
Run Code Online (Sandbox Code Playgroud)

  • 请注意,接收到确认意味着远程已接收到消息,但是**未**接收到确认并不意味着远程尚未接收到消息-网络连接可能已断开接收消息并发送知识。 (2认同)