我在tomcat 6上使用comet从服务器推送数据,如下所述:http://www.ibm.com/developerworks/web/library/wa-cometjava/
我的问题很简单:如果我在event.close();
和writer.print
之后没有writer.flush
,那么数据似乎不会发送到客户端,因为{ <{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
希望这个帮助