为什么我需要关闭彗星事件来发送数据? (tomcat 6)

时间:2012-04-23 19:47:26

标签: tomcat tomcat6 comet

我在tomcat 6上使用comet从服务器推送数据,如下所述:http://www.ibm.com/developerworks/web/library/wa-cometjava/

我的问题很简单:如果我在event.close();writer.print之后没有writer.flush,那么数据似乎不会发送到客户端,因为{ <{1}}的{​​{1}}未被调用。

这是正常的吗?

因此,我需要在每次收到数据时向服务器发送新请求,因为需要关闭连接才能发送数据。

任何解决方案?

1 个答案:

答案 0 :(得分: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()没有这样的浏览器将是3而 getResponseText()将返回响应文本(当服务器端执行writer.flush()而不需要writer.close()) 。

但由于IE&lt; 10状态= 3时, getResponseText()是不可能的,只有状态== 4.状态4是关闭的状态。这就是为什么在刷新数据后需要密切连接的原因,因为其他情况IE将继续加载数据并且永远不会处理它。但是有可能在服务器端和关闭后管理数据量;

查看此链接,了解如何实施tomcat 7 comet

希望这个帮助