Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript websocket客户端在快速调用socket.send()时间歇性地无法传输_Javascript_Node.js_Tcp_Websocket - Fatal编程技术网

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

Javascript websocket客户端在快速调用socket.send()时间歇性地无法传输,javascript,node.js,tcp,websocket,Javascript,Node.js,Tcp,Websocket,我有一个websocket服务器和客户端。我能够建立连接并在两个方向上传输消息(数据)。但是,当在web浏览器中运行的客户端快速调用socket.send()时,服务器不会接收到某些消息。如果我减慢对socket.send()的客户端调用,服务器将接收所有消息。为什么调用socket.send()的计时与间歇性删除消息有关 当Chrome、FireFox和Safari在Win7、Android和iOs上运行时,就会出现这种行为。因此,我不认为这是一个浏览器错误 服务器是nodejs,但这与此无

我有一个websocket服务器和客户端。我能够建立连接并在两个方向上传输消息(数据)。但是,当在web浏览器中运行的客户端快速调用socket.send()时,服务器不会接收到某些消息。如果我减慢对socket.send()的客户端调用,服务器将接收所有消息。为什么调用socket.send()的计时与间歇性删除消息有关

  • 当Chrome、FireFox和Safari在Win7、Android和iOs上运行时,就会出现这种行为。因此,我不认为这是一个浏览器错误
  • 服务器是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流量。然而,这是一个挑战,因为浏览器XOR和websocket密钥的使用意味着我必须手动解密每条消息。慢而且不好玩。有人有更好的主意吗
  • 我的代码是一个更大项目的一部分,这个项目太大,太复杂,无法发布。我正在开发一个小的测试存根,它可能有助于调试问题。如果我能用上存根,我就把它寄出去。在任何情况下,当对socket.send()的调用在时间上间隔开时,较大的项目“工作”,因此我认为这不是项目中其他地方的代码的问题
  • 我认为这是我理解如何使用WebSocket和/或TCP的一个问题
  • 另一个线程建议使用防病毒软件(stackoverflow问题21191620)。我已尝试禁用我的防病毒软件。没有效果。同样,Android手机和iTouch上的问题是相同的,因为它们没有运行防病毒软件

这是多年来我第一次无法通过stackoverflow等网站在web上进行研究来解决问题。我一直在谷歌上搜索这个问题,直到我的手指麻木为止。因此,我最终在这里创建了一个帐户并发布了一个问题。请帮忙

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

具体原因是(维基百科链接)

具体来说,如果在短时间内发送多条消息,TCP可能会将其中一些消息合并到同一TCP帧中

这将导致在同一IP数据包中出现多个WebSocket(WS)帧。行为良好的WS-server只会在WS-frame的标头显示有数据时才读入TCP帧。理解Nagle算法的行为良好的WS-server随后将检查另一个WS-frame进行解码

我在开发基于PHP的WS-server时遇到的一个问题是,一旦服务器读取到第一条消息的末尾,如果还有任何数据剩余,当我尝试检查新数据包时,网络堆栈会大声抱怨

表现不佳的WS-server可能会读取超出WS-frame表示数据结束的位置的数据,并在第一条消息的数据中包含第二条消息的WS-frame,或者以奇怪和不寻常的方式失败

如果您必须进行实时通信,则TCP_节点延迟标志可用。不过,对于大多数人的网络来说,让Nagle的算法排队并合并消息通常被认为是一种很好的方式


这通常只是服务器端的问题,因为绝大多数WS-Client都是web浏览器,它们已经知道Nagle的算法。

“服务器不是问题所在”-您怎么知道这一点?可能是你用来丢弃信息的模块,对吗?“我正在尝试嗅探TCP流量…”-你看过chrome中的网络选项卡了吗?如果单击websocket连接,您可以看到浏览器认为已发送/接收的帧。如果知道那里是否有消息,那会很有用。您是否有连接到套接字的
onerror
处理程序?-服务器是使用node.js中的“net”模块实现的。调试代码告诉我数据何时到达服务器。我在客户端有一个onerror处理程序,它不会启动。我可以在chrome.network中看到框架,但它们告诉我的不多。我如何查看浏览器认为它发送的数据?我不确定服务器是否有故障。但是,我不认为时间问题可能是服务器故障。所以我很高兴