我在 tomcat 6 上使用 comet 从服务器推送数据,如下所述:http://www.ibm.com/developerworks/web/library/wa-cometjava/
我的问题很简单:如果我在 writer.print
和 writer.flush
之后不执行 event.close();
>,那么数据似乎没有发送到客户端,因为没有调用 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 将继续加载数据并且从不处理它。但可以在服务器端和关闭后管理数据量;
看这个链接,怎么实现tomcat 7 comet
希望这有帮助
关于tomcat - 为什么我需要关闭 cometd 事件才能发送数据? ( Tomcat 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10287210/