使用原始WebSocket时,如何知道消息是否已成功发送?

时间:2018-01-25 04:34:17

标签: javascript browser websocket

与接受可选ack回调的websocket/ws不同,原始WebSocket.prototype.send只接受一条消息。

1 个答案:

答案 0 :(得分:0)

请注意已发送!= 已收到 ...我假设您要确保邮件已收到。< / p>

实施ACK。它非常简单,这是我知道确保收到消息的唯一方式。

足够好的方法会在客户端附加消息ID,并将该ID作为消息的一部分发送(即在JSON中作为msgID)。我使用定时器ID,因为我在ACK到达时取消了定时器,这是保存定时器数据的好方法。

当服务器识别出msgID时,它应该在处理剩余的消息之前自动发送具有相同消息ID的ACK(即{"event":"ACK", "data":m["msgID"]}的JSON)。

如果您正在使用二进制数据,则只需在每条消息的开头添加固定大小的ID(例如,8个字节),或为动态大小的ID附加长度指示符。

编辑关于雷米评论的反思:

是的,使用超时ID可能在很大程度上依赖于ID&#34; pool&#34;实施。

更安全的设计可能更倾向于通过使用计数器或其他方法来避免假设。

但是,还应该注意的是,在我测试此方法的所有浏览器中,超时ID始终是唯一的。

Mozilla Developer Documentation Site上,它声明:

  

保证在同一对象(窗口或工作者)上对setTimeout()或setInterval()的后续调用永远不会重用超时ID。但是,不同的对象使用单独的ID池。

我认为这个假设对于所有浏览器都是正确的(取决于ID类型溢出并将自身重置为零)。