在Apple设备上运行Websockets时网络性能不佳

时间:2013-01-30 17:17:08

标签: 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时间都会增加到200ms。

从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端发送数据。

2 个答案:

答案 0 :(得分:1)

很少有想法和建议。

  • 检查服务器是否支持客户端的WebSocket协议。 This问题和答案讨论了不同协议版本存在问题的案例。
  • WebSocket standard允许实现任意延迟传输并执行分段。此外,控制帧(如Ping)不支持碎片,但允许插入。这些允许的行为差异可能会导致时间差异。
  • 检查WebSocket上的bufferedAmount属性是否确定WebSocket是否正在缓冲数据。如果bufferedAmount属性通常为零,则数据已传递给操作系统,操作系统可能会根据操作系统或套接字配置(例如Nagle)对其进行缓冲。
  • This问题和答案提到让服务器为每封邮件发送确认来解决延迟。
  • 要深入了解交互,可能需要执行数据包跟踪。 Mac开发人员库中的This技术Q&amp; A可能会提供一些资源来说明如何实现这一目标。

答案 1 :(得分:1)

获得更多洞察力的最佳方式是使用AutobahnTestsuite。您可以使用该套件测试客户端和服务器,并找出问题所在。

我创建了QWebSockets,一个基于Qt的websockets实现,并在几个场合用它来创建服务器。 Apple设备的性能非常出色。

但是,对于大型消息,Safari似乎存在严重问题(请参阅https://github.com/KurtPattyn/QWebSockets/wiki/Performance-Tests)。也许这就是问题所在。