簡體   English   中英

在Apple設備上運行的Websockets網絡性能不佳

[英]Poor network performance with Websockets running on apple device

我正在研究與PC上運行的Qt / C ++應用程序通信的移動設備上運行的HTML / Javascript。 移動設備和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>

數據從Javascript端使用劑量()函數發送。

很少的想法和建議。

  • 檢查服務器是否支持客戶端的WebSocket協議。 問題和答案討論了不同協議版本成為問題的情況。
  • WebSocket 標准允許實現任意延遲傳輸並執行分段。 此外,控制幀(例如Ping)不支持分段,但允許插入。 這些允許的行為差異可能會導致時間差異。
  • 檢查WebSocket上的bufferedAmount屬性是否確定WebSocket是否正在緩沖數據。 如果bufferedAmount屬性通常為零,則數據已傳遞到OS,OS可能會根據OS或套接字配置(例如Nagle)對其進行緩沖。
  • 問題和答案提到通過使服務器為每個消息發送確認來解決延遲。
  • 為了更深入地了解交互,執行數據包跟蹤可能很有用。 Mac開發人員庫中的技術問答可能會提供一些有關如何完成此操作的資源。

獲得更多見識的最佳方法是使用AutobahnTestsuite 您可以使用該套件測試客戶端和服務器,並找出問題所在。

我創建了QWebSockets ,它是一個基於Qt的websockets實現,並多次使用它來創建服務器。 Apple設備的性能出色。

但是,當涉及到大消息時,Safari似乎存在嚴重問題(請參閱https://github.com/KurtPattyn/QWebSockets/wiki/Performance-Tests )。 也許這就是問題所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM