3

私はPythonで独自のチャットWebサーバーを作成し、AJAXが毎秒サーバーを呼び出す代わりに知りたいと思っていました(以下のJS)。サーバーを変更して、chat.htmlファイルを更新するたびにすべてのクライアントにプッシュするようにすることができます。javascriptを使用して、ポーリングではなく受信データをリッスンする方法はありますか?

<script>
// Request the AJAX update the chat window every second
setInterval(function(){loadChat()},1000);

function loadChat()
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {
        xmlhttp = new XMLHttpRequest();

        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("chatWindow").innerHTML=xmlhttp.responseText;
            }
        }

        xmlhttp.open("GET","chat.html",true);
        xmlhttp.send(null);
    }
}
</script>
4

4 に答える 4

5

はい、確かにあります。使用できるテクニックは(少なくとも)4つあります。

  1. WebSocket。これが最も明白な解決策です。ポーリングを必要とせずに、オンデマンドでメッセージを送受信できます。ただし、プレーンHTTPではないため、サーバー側での実装はやや難しい場合があります。また、古いブラウザはWebSocketをサポートしていません。

  2. サーバー送信イベント。これはあまり望ましくありませんが、それでも機能します。これを使用すると、ポーリングせずにサーバーからメッセージを受信できます。また、接続が閉じないことを除けば、単なるHTTPであるため、サーバーへの実装も簡単です。また、一部の古いWebブラウザーではサポートされていませんが、WebSocketよりもサポートされており、簡単に変更できます。

  3. 彗星。これは基本的に以下のことの改善です。基本的に、iframe画面外に隠されているものがあります。イベントが発生するたびに、スクリプトタグを送信(およびフラッシュ)しますが、接続を閉じないでください。タイムアウト後、接続を閉じます。次に、を更新しiframeます。これも実装が非常に簡単で、プレーンHTTPであり、特別なブラウザサポートは必要ありません。ただし、ブラウザのタイムアウトはさまざまであり、これはややエレガントではありません。

  4. イベントが発生するまで接続を開いたままにします。これはおそらく最も望ましくありません。イベントが発生するまで応答を送信しないでください。イベントが発生した場合、またはタイムアウトが発生した場合は、応答を送信してください。クライアントが応答を受信したら、再接続します。これもややエレガントではありませんが、機能します。

于 2013-03-02T03:58:05.037 に答える
1

あなたが話しているのは、サーバーから、そのような方法で使用できる彗星であるクライアントにプッシュすることです。

ただし、これはHTML5のnode.jsとWebSocketで完全に実行できますが、すべてのブラウザーでサポートされているわけではありません。これを確認してください

そして、あなたは別のものを作ることができます

JSからリクエストを送信し、1分間有効にして、数秒間スリープする無限ループを作成します。それがクライアントに返される間に何かが見つかった場合は、新しいリクエストを作成します。この手法はHeartBeatと呼ばれます。

これがお役に立てば幸いです

于 2013-03-02T03:58:25.447 に答える
0

簡単に言うと、ほとんどの場合、使用できません。ただし、HTML5 Websocketは一般的にサポートされていませんが、使用できます。

SockJSは、さまざまなメソッドを使用してJavaScriptでコールバックを実行します。そのうちの1つはブロッキングクエリで、もう1つはWebSocketです。あなたがこの種のことをしようとしているなら、私はそれを強くお勧めします。

于 2013-03-02T03:55:44.227 に答える
0

これは、WebSocketを使用して行うことができます。残念ながら、現在すべてのブラウザがそれらをサポートしているわけではありません。

WebSocketの詳細については、こちらをご覧ください。

于 2013-03-02T03:56:09.093 に答える