2

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

我的问题很简单:如果我在andevent.close();之后不做 a ,那么数据似乎不会发送到客户端,因为 the没有被调用。writer.printwriter.flushonreadystatechangeXMLHttpRequest

正常吗?

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

有什么解决办法吗?

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

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

看这个链接,如何实现tomcat 7 comet

希望这有帮助

于 2012-06-08T21:03:23.450 回答