javascript - 在苹果设备上运行的 Websockets 网络性能不佳

标签 javascript c++ websocket boost-asio

我正在研究在移动设备上运行的 HTML/Javascript,它与在 PC 上运行的 Qt/C++ 应用程序进行通信。移动设备和 PC 都在本地网络上。 HTML 页面(客户端)和 C++ 应用程序(服务器)之间的通信是使用 Websockets 完成的。

HTML 页面是 C++ 应用程序的远程控制,因此需要在移动设备和 PC 之间建立低延迟连接。

当使用任何非 Apple 设备作为客户端时,数据发送的速率在 60 到 120 帧/秒之间,这是完全可以接受的。使用 Apple 设备时,此速率降至 3-4 帧/秒。 我还检查了 ping 时间(Websocket 实现,而不是来自命令行的 ping 命令)。只要设备不传输数据,它们对于 Apple 设备是可接受的(1-5 毫秒)。每当它传输数据时,此 ping 时间都会增加到 200 毫秒。

从 Javascript 方面来看,Apple 设备始终以 60 帧/秒的一致速率发送数据,就像任何其他设备一样。但是,在服务器端,当客户端是 Apple 设备时,这 60 帧中只有 3 到 4 帧被接收到。

有人知道会发生什么吗?

这是我的 Javascript 代码:

<script language="javascript" type="text/javascript">

        var wsUri = document.URL.replace("http", "ws");
        var output;
        var websocket;


        function init()
        {
            output = document.getElementById("output");
            wsConnect();
        }

        function wsConnect()
        {
            console.log("Trying connection to " + wsUri);
            try
            {
                output = document.getElementById("output");
                websocket = new WebSocket(wsUri);
                websocket.onopen = function(evt)
                {
                        onOpen(evt)
                };
                websocket.onclose = function(evt)
                {
                        onClose(evt)
                };
                websocket.onmessage = function(evt)
                {
                        onMessage(evt)
                };
                websocket.onerror = function(evt)
                {
                        onError(evt)
                };
            }
            catch (e)
            {
                console.log("Exception " + e.toString());
            }
        }


        function onOpen(evt)
        {
            alert("Connected to " + wsUri);
        }

        function onClose(evt)
        {
            alert("Disconnected");
        }

        function onMessage(evt)
        {
            alert('Received message : ' + evt.data);
        }

        function onError(evt)
        {
            alert("Error : " + evt.toString());
        }

        function doSend(message)
        {
            websocket.send(message);
        }

        window.addEventListener("load", init, false);
</script>

使用 dosend() 函数从 Javascript 端发送数据。

最佳答案

一些想法和建议。

  • 检查服务器是否支持客户端的 WebSocket 协议(protocol)。 This问答讨论不同协议(protocol)版本成为问题的案例。
  • WebSocket standard允许实现任意延迟传输并执行分段。此外,Ping 等控制帧不支持分段,但允许插入。这些允许的行为差异可能导致时间差异。
  • 检查 bufferedAmount 是否WebSocket 上的属性以确定 WebSocket 是否正在缓冲数据。如果 bufferedAmount 属性通常为零,则数据已传递给操作系统,操作系统可能会根据操作系统或套接字配置(例如 Nagle)对其进行缓冲。 .
  • This问答提到通过让服务器为每条消息发送确认来解决延迟。
  • 要更深入地了解交互,执行数据包跟踪可能会有用。 This Mac Developer Library 中的技术问答可能会提供一些关于如何完成此任务的资源。

关于javascript - 在苹果设备上运行的 Websockets 网络性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609858/

相关文章:

node.js - 什么是 websocket 的最佳工具?

javascript - 如何在具有跨度的 div 中分隔单词

javascript - jQuery 或 Javascript 连续计数器(countup)

javascript - 当ImageData不可用时如何提供正确的数据?

c++ - C++单例代码解释

javascript - 需要找到 MQTT 的安全 Websocket 代理

javascript - 如何将项目连接到根数组中的最后一个数组?

c++ - 我的代码的第二部分没有运行,我是使用类的新手

c++ - QSortFilterProxyModel 对多列进行排序

java - 对于每个 Spring websocket 事件,Principal 为 null