【问题标题】:Getting an acknowledgment on server send/emit获得服务器发送/发送的确认
【发布时间】:2012-03-05 14:39:24
【问题描述】:

在 socket.io 确认示例中,我们看到客户端的发送/发送与服务器的响应一起被回调。相同的功能是否可以反向使用 - 即服务器如何确认客户端接收来自服务器的发送/发送?即使只是为了指示接收成功,也有一个发送/发送回调会很好。没有在任何地方看到此功能记录... 谢谢!

【问题讨论】:

  • 好的,测试了它,它似乎是对称的......(太糟糕的文档对此不清楚)。但是,在测试时我遇到了另一个问题:如果客户端在发送响应之前断开连接,则发送方的发出/发送回调永远不会被触发。在我看来,如果修改回调机制以包含错误参数,则 API 可能会得到改进,例如:socket.emit('ferret', 'tobi', function (err, data) {。 ......
  • 我在这里发布了一个关于我最新一期的直接问题:link,请忽略之前的 Q,谢谢。

标签: socket.io


【解决方案1】:

查看socket.io source,我发现服务器发送的消息确实支持 ACK(但广播中不支持!)(socket.io/lib/socket.js 的第 115-123 行 ):

if ('function' == typeof args[args.length - 1]) {
    if (this._rooms || (this.flags && this.flags.broadcast)) {
        throw new Error('Callbacks are not supported when broadcasting');
    }

    debug('emitting packet with ack id %d', this.nsp.ids);
    this.acks[this.nsp.ids] = args.pop();
    packet.id = this.nsp.ids++;
}

ack 应该如何工作的示例(未测试):

// server-side:
io.on('msg', (data, ackCallback) => {
  console.log('data from client', data);
  ackCallback('roger roger');
});

// client-side:
socket.emit('msg', someData, (answer) => {
  console.log('server\'s acknowledgement:', answer);
});

【讨论】:

【解决方案2】:

如果我们想100%确定接收成功,仅仅添加ack call是不够的,因为我们还需要知道ack call是否运行。

The socket.io 3.0 document 添加此超时示例以显示如何执行此操作。但是超时值是一个棘手的问题。

const withTimeout = (onSuccess, onTimeout, timeout) => {
  let called = false;

  const timer = setTimeout(() => {
    if (called) return;
    called = true;
    onTimeout();
  }, timeout);

  return (...args) => {
    if (called) return;
    called = true;
    clearTimeout(timer);
    onSuccess.apply(this, args);
  }
}

socket.emit("hello", 1, 2, withTimeout(() => {
  console.log("success!");
}, () => {
  console.log("timeout!");
}, 1000));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多