如何确保客户端已收到通过socket.io发送的消息

How to be sure that message via socket.io has been received to the client?

本文关键字:socket io 消息 何确保 确保 客户端      更新时间:2023-09-26

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

谢谢你的回答!

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

典型的实现方式如下:

客户端

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"); });

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

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

在客户端

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

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

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

socket.io文档中的报价:

有时,您可能希望在客户端确认时得到回调消息接收。

为此,只需传递一个函数作为.send的最后一个参数,或CCD_ 2。更重要的是,当您使用.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');
});

在服务器端,您会被调用数据和回调句柄来发送响应:

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.
});