2

ここで説明されているように、Tomcat 6でcometを使用してサーバーからデータをプッシュします: http://www.ibm.com/developerworks/web/library/wa-cometjava/

私の問題は単純です: のevent.close();後にa を実行しないwriter.printと、 のが呼び出されないwriter.flushため、データがクライアントに送信されないようです。onreadystatechangeXMLHttpRequest

それは正常ですか?

そのため、データを送信するには接続を閉じる必要があるため、データを受信するたびにサーバーに新しいリクエストを送信する必要があります。

解決策はありますか?

4

1 に答える 1

2

いいえ、Chrome、Safari、FireFox では正常ではありません。イベント readystate.LOADED で、クライアント側のサーバーからのデータを処理できるため

/**
* @param {string} url
* @param {function(*)} callback 
* @param {boolean} reload */
archiva.io.streamXhr = function(url, callback) {

    var xhr = new goog.net.XhrIo();
    var lastIndex = -1;
    var delimiter = '\n';

    goog.events.listen(xhr, goog.net.EventType.READY_STATE_CHANGE, function() {
        // As more data is loaded, look for the next delimiter so the JSON can // be extracted, parsed, and passed to the callback.

        if ( xhr.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ) {
            var str = xhr.getResponseText();
            var index;
            while ((index = str.indexOf(delimiter, lastIndex + 1)) != -1) {
                var json = str.substring(lastIndex + 1, index);
                callback(json);
                lastIndex = index;
            }
        }

        if (xhr.isComplete()) {
            // Reconnect if the response finishes for any reason.
            archiva.io.streamXhr(url, callback);
            xhr.dispose();
        }
    });

    xhr.send(url, 'POST'); 
};

および xhr.getReadyState() no そのようなブラウザーは 3 になり、getResponseText()は応答テキストを返します (サーバー側で writer.flush() を実行し、 writer.close() を実行する必要がない場合)。

しかし、IE < 10 のため、状態 = 3 ではgetResponseText()を実行できません。状態 == 4 のみです。状態 4 はクローズの状態です。これが、データをフラッシュした後に接続を閉じる必要がある理由です。他の場合、IE はデータのロードを続行し、処理しないためです。ただし、サーバー側およびクローズ後のデータ量を管理することは可能です。

このリンクを見て、Tomcat 7コメットを実装する方法

この助けを願っています

于 2012-06-08T21:03:23.450 に答える