gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:46:27 29 4
gpt4 key购买 nike

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

最佳答案

请注意,已发送 != 已收到...我假设您想确保消息已已收到

实现ACK。这非常简单,也是我所知道的确保收到消息的唯一方法。

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

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

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

编辑反射(reflection)雷米的评论:

是的,使用超时 ID 可能在很大程度上依赖于 ID“池”的实现方式。

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

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

关于Mozilla Developer Documentation Site ,它指出:

It is guaranteed that a timeout ID will never be reused by a subsequent call to setTimeout() or setInterval() on the same object (a window or a worker). However, different objects use separate pools of IDs.

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

关于javascript - 使用原始 WebSocket 时如何知道消息是否已成功发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48435740/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com