comet技術:服務端向客戶端主動推消息的技術,但側重基于http的協議,如果是socket則不存在這個問題.
從tomcat6開始,增加了org.apache.catalina.CometProcessor接口來實現對comet技術的支持.
修改conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"-改為->"org.apache.coyote.http11.Http11NioProtocol"
java:請參看tomcat.apache.org上的CometServlet的例子.
import javax.servlet.http.HttpServlet;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
CometServlet extends HttpServlet implements CometProcessor
javascript:
function installComet(){
var xmlReq = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
xmlReq.onreadystatechange = handler;
xmlReq.open("GET", "/yourapp/comet",true);
xmlReq.send();
}
function handler(){
try{
if(xmlReq.readyState){
if(xmlReq.readyState>=3){
alert(xmlReq.responseText);
}
}
}catch(e){
alert(xmlReq.readyState+":e->:"+e.message);
}
}
在IE瀏覽器各個版本中handler只會被回調一次而不管服務端針對此次連接發多少次消息,此時的readyState為3
對responseText的操作會引發javascript error:完成該操作所需的數據還不可使用。
在Firefox中handler會被多次調用,但responseText會緩存前一次的消息而不會清除,responseText的數據會隨著服務端消息的到達而累積.
到目前為止,瀏覽器只能通過插件的方式來實現對comet技術在客戶端的支持,所以流行的flash player,ActionScript就成為了首選.
ActionScript通過socket來建立長連接.
所以那些AJAX框架都不能真正的支持comet,而只能通過poll,setTimeout/setInterval,
而dwr的ReverseAjax正是使用了setTimeout來poll輪詢服務端的,請參看dwr的engine.js的源碼.