MobileSafari上JavaScript websocket中的明显阻塞行为

MobileSafari上JavaScript websocket中的明显阻塞行为,javascript,ios,events,safari,websocket,Javascript,Ios,Events,Safari,Websocket,我遇到了一个真正的麻烦,我希望有人能对我的问题有所了解 我正在编写的应用程序是一个基于JS的客户端,本质上是一个桌面共享服务。该服务从桌面捕获图像,将其编码为base64编码的JPEG,并通过websocket将其发送到JS客户端。然后,客户端显示这些图像(作为数据URI),用户可以将鼠标移到图像上,也可以单击图像,这些鼠标事件被编码为XML中的命令,这些命令被放入队列中,并每隔15毫秒在计时器上提供服务,这样就可以在发送到服务之前清除队列中的冗余或重复命令。然后执行这些命令(在桌面上生成单击事

我遇到了一个真正的麻烦,我希望有人能对我的问题有所了解

我正在编写的应用程序是一个基于JS的客户端,本质上是一个桌面共享服务。该服务从桌面捕获图像,将其编码为base64编码的JPEG,并通过websocket将其发送到JS客户端。然后,客户端显示这些图像(作为数据URI),用户可以将鼠标移到图像上,也可以单击图像,这些鼠标事件被编码为XML中的命令,这些命令被放入队列中,并每隔15毫秒在计时器上提供服务,这样就可以在发送到服务之前清除队列中的冗余或重复命令。然后执行这些命令(在桌面上生成单击事件、移动鼠标等),生成新的桌面图像并继续循环

除了在iPad上的Safari上出现一些非常不一致的行为外,整个系统工作得非常好。本质上,当用户在屏幕上移动手指时,客户端似乎会阻止(或可能取消优先级)websocket上的传入消息,而只发送传出消息。这是显而易见的,当你移动手指时,只要你触摸屏幕,屏幕就不会显示更新,然后一旦你抬起手指,onMessage()就会收到大量图像更新,然后会在屏幕上快速连续设置动画

Mobile Safari是唯一一款表现出这种行为的浏览器,我测试过的所有桌面浏览器或Android平板电脑都没有表现出同样的行为

我已经在websocket上将日志记录到入站和出站方法中,它确认了我看到的行为。在Safari上,我会连续收到大量的出站消息,然后是大量的入站消息,而在Android上,当你在屏幕上拖动手指时,我会看到入站消息和出站消息交错,因此Android上的显示会随着你的手指的拖动而继续更新

我怀疑websocket是罪魁祸首的主要原因是,客户端有一个回退机制,因此,如果浏览器不支持websocket,将创建一对XHR对象(一个用于入站,一个用于出站),并使用它们代替websocket。如果我强制mobilesafari使用XHR而不是websockets,问题就不会出现了。在这种情况下,只有通信机制改变(用于捕获输入事件和显示图像的所有代码保持不变)

我意识到这是一个非常特殊的问题,没有代码就很难诊断,但我选择不发布代码,因为客户端中的代码量太大了


如果有人看到类似于我所描述的行为,或者知道这种行为的任何潜在原因,我将非常感谢您的输入。

根据数据包的大小,您可能会面临“大”消息的问题,在Safari(iPad和桌面)上速度非常慢。你试过桌面Safari吗

看看,看看不同浏览器之间的性能比较


这可能是您的问题。

我仍在试图弄清楚,如果您尝试发送大量数据,或者他们复制要异步发送的数据,以便调用立即返回,则
send
调用是否会阻塞。似乎您正在描述一种情况,即快速发送的调用将导致onmessage事件延迟。我的问题是: