8

PC で実行されている Qt/C++ アプリケーションと通信しているモバイル デバイスで実行されている HTML/Javascript に取り組んでいます。モバイル デバイスと PC の両方がローカル ネットワーク上にあります。HTML ページ (クライアント) と C++ アプリ (サーバー) の間の通信は、Websocket を使用して行われます。

HTML ページは C++ アプリケーションのリモート コントロールであるため、モバイル デバイスと PC の間の接続を低遅延にする必要があります。

Apple 以外のデバイスをクライアントとして使用する場合、データは 60 ~ 120 フレーム/秒の速度で送信されますが、これはまったく問題ありません。Apple デバイスを使用する場合、このレートは 3 ~ 4 フレーム/秒に低下します。また、ping時間もチェックしました(コマンドラインからのpingコマンドではなく、Websocketの実装です)。デバイスがデータを送信していない限り、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 側からデータを送信します。

4

2 に答える 2

1

アイデアや提案が少ない。

  • クライアントの WebSocket プロトコルがサーバーでサポートされているかどうかを確認してください。 この質問と回答では、異なるプロトコル バージョンが問題となったケースについて説明します。
  • WebSocket標準では、実装が送信を任意に遅延させ、断片化を実行することが許可されています。さらに、Ping などの制御フレームはフラグメンテーションをサポートしていませんが、挿入することは許可されています。これらの許容された行動の違いは、時間の違いに寄与している可能性があります.
  • WebSocketの属性を確認bufferedAmountして、WebSocket がデータをバッファリングしているかどうかを判断します。属性がしばしば 0 である場合、データは OS に渡されており、OS またはNaglebufferedAmountなどのソケット構成に基づいてバッファリングされている可能性があります。
  • この質問と回答では、サーバーがメッセージごとに確認応答を送信することで遅延を解決することについて言及しています。
  • 相互作用をより深く理解するには、パケット トレースを実行すると役立つ場合があります。 Mac Developer Library のこの技術的な Q&A は、これを達成する方法に関するいくつかのリソースを提供する場合があります。
于 2013-01-31T18:49:43.390 に答える