2

我正在使用 Uint8Arrays 和 ArrayBuffers 发送二进制数据。我可以通过每次创建一个新的 Uint8Array 和 ArrayBuffer 来成功发送它。

出于性能目的(减少垃圾等),我想为下一条消息重用相同的 Uint8Array 和 ArrayBuffer 。在这种情况下,每条消息都具有相同的字段,因此字节长度不是问题。我只是覆盖它。

但是,重用会导致发送的数据不正确。

我最好的猜测是,我正在为下一条消息修改 ArrayBuffer,而前一条消息仍在发送过程中。这是问题吗?如果是这样,有什么方法可以检测到 WebSocket 何时不再使用 ArrayBuffer 以便我可以将其汇集起来?如果不是,还有什么可能导致这种行为?

谢谢!

4

1 回答 1

0

显然,这个错误只是我的一个逻辑错误。

为了以二进制形式发送内容,我编写了一个 Message 对象,该对象使用位移和整数加法来填充 Uint8Array。当我编写我的重置函数时,我只重置位置变量而不是数组值,假设它的函数会正确覆盖数组。

但是,由于向数组添加新值使用的是加法 (array[0] += newvalue) 而不是集合 (array[0] = newvalue),因此任何新数据都会被旧值破坏。

我现在感觉有点傻

Dhruv Chopra 和 Kanaka 的评论帮助我指明了正确的方向。我使用 10 秒间隔的 setTimeout 函数进行了测试,但它仍然给我错误的值,这让我意识到这只是我的一个愚蠢的错误。我想赞扬他们,但我不知道如何。

尽管如此,还是非常感谢您的帮助!我很感激。

编辑:显然我只能在 8 小时后回答我自己的问题。我明天会这样做以避免混淆。

编辑 2: 显然我现在可以投票赞成评论。再次感谢。

于 2012-12-27T20:06:29.053 回答