gpt4 book ai didi

tomcat - 为什么我需要关闭 cometd 事件才能发送数据? ( Tomcat 6)

转载 作者:行者123 更新时间:2023-11-28 21:59:03 27 4
gpt4 key购买 nike

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

我的问题很简单:如果我在 writer.printwriter.flush 之后不执行 event.close(); >,那么数据似乎没有发送到客户端,因为 XMLHttpRequestonreadystatechange 没有被调用。

这正常吗?

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

有什么解决办法吗?

最佳答案

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

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

希望对你有帮助

关于tomcat - 为什么我需要关闭 cometd 事件才能发送数据? ( Tomcat 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10287210/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com