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

为什么我需要关闭comet事件来发送数据?(tomcat 6),tomcat,tomcat6,comet,Tomcat,Tomcat6,Comet,我在tomcat 6上使用comet从服务器推送数据,如下所述: 我的问题很简单:如果我不执行事件.close()在mywriter.print和writer.flush之后,数据似乎不会发送到客户端,因为XMLHttpRequest的onreadystatechange没有被调用 这正常吗 因此,每次接收数据时,我都需要向服务器发送一个新请求,因为需要关闭连接才能发送数据 有什么解决方案吗?没有,这对于Chrome、Safari和FireFox都不正常。因为在事件readystate.LOAD

我在tomcat 6上使用comet从服务器推送数据,如下所述:

我的问题很简单:如果我不执行
事件.close()
在my
writer.print
writer.flush
之后,数据似乎不会发送到客户端,因为
XMLHttpRequest
onreadystatechange
没有被调用

这正常吗

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


有什么解决方案吗?

没有,这对于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<10,在state=3时不可能getResponseText(),只有state==4。状态4为关闭状态。这就是为什么在刷新数据后需要紧密连接的原因,因为在其他情况下IE将继续加载数据,并且永远不会处理它。但也可以在服务器端和关闭后管理大量数据

看看这个环节,如何实施

希望这有帮助