gpt4 book ai didi

javascript - 快速调用 socket.send() 时,websocket 客户端间歇性地无法传输

转载 作者:可可西里 更新时间:2023-11-01 02:41:03 26 4
gpt4 key购买 nike

我有一个 websocket 服务器和客户端。我能够建立连接并双向传输消息(数据)。但是,当在 Web 浏览器中运行的客户端快速调用 socket.send() 时,服务器不会接收到一些消息。如果我放慢客户端对 socket.send() 的调用,则服务器会收到所有消息。为什么调用 socket.send() 的时间与间歇性丢弃消息有什么关系?

  • 在 Win7、Android 和 iOs 上运行的 Chrome、FireFox 和 Safari 会出现此行为。因此,我不认为这是浏览器错误。
  • 服务器是 nodejs,但这无关紧要,因为服务器不是问题所在。
  • 我所说的快速调用是指在由 requireAnimationFrame() 控制的循环中进行调用。
  • 消息中的数据量很小,每条约 40 字节。有 < 10 条消息,即连续调用 socket.send()。因此我看不出我怎么会溢出 TCP 缓冲区。但也许?
  • websocket 处于“arraybuffer”模式。
  • socket.bufferedAmount === 每次发送前后均为 0,无论消息是否被客户端丢弃。
  • 套接字在丢弃消息后继续双向发送消息。例如,客户端将对 socket.send() 进行 10 次调用,服务器将看到除 3 和 7 之外的所有消息,而客户端将看到服务器发送的所有消息。
  • 我已经在调用 socket.send() 之前验证了数据的完整性。客户端代码调用 var tmpArrayBuffer = new ArrayBuffer( n ) 以在每次调用 socket.send( tmpArrayBuffer ) 之前创建一个新缓冲区。因此,我认为我的客户端代码不会覆盖它自己的缓冲区。
  • 从来没有发生过消息损坏的情况。消息要么完好无损地到达,要么根本没有到达。大多数消息都会到达。
  • 我的老 C 程序员认为这是过度写入缓冲区的情况。但我看不出这在 javascript 中如何可能,并且鉴于 socket.send() 应该是我对数据的责任的结束。
  • 我正在尝试使用 MS Message Analyzer 嗅探客户端和服务器之间的 TCP 流量。然而,这是一个挑战,因为浏览器与 websocket key 的异或意味着我必须手动解密每条消息。慢而不好玩。谁有更好的主意?
  • 我的代码是一个较大项目的一部分,该项目太大且复杂,无法发布。我正在研究一个可能有助于调试问题的小测试 stub 。如果/当我让它工作时,我会发布 stub 。在任何情况下,当对 socket.send() 的调用在时间上间隔开时,较大的项目“工作”,因此我认为这不是项目中其他地方的代码的问题。
  • 我认为这是我对如何使用 websockets 和/或 TCP 的理解有问题。
  • 另一个线程建议使用防病毒软件(stackoverflow 问题 21191620)。我试过禁用我的防病毒软件。没有效果。此外,Android 手机和未运行防病毒软件的 iTouch 上的问题是相同的。

这是多年来我第一次无法通过 stackoverflow 等网站在网络上研究问题来解决问题。我用谷歌搜索了这个问题,直到我的手指都 NumPy 了。因此,我终于在这里创建了一个帐户并发布了一个问题。请帮忙!

最佳答案

问题出在服务器上,而不是客户端。 Node.js 在单个回调中传递多条消息。我的代码假定每个 ws 消息都有一个回调。在消息以高速率传递之前,这不是问题。一旦修改了服务器代码以解析各个消息,问题就消失了。快乐的日子!

关于javascript - 快速调用 socket.send() 时,websocket 客户端间歇性地无法传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048793/

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