与接受可选ack
回调的websocket/ws不同,原始WebSocket.prototype.send只接受一条消息。
答案 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类型溢出并将自身重置为零)。