comet是服务器“推”技术的的一种实现,apache-tomcat提供了comet的支持。
下面来说说comet的工作原理:
Comet主要是利用客户端向服务器发出请求时,服务器发回响应内容,并利用javascript建立一个长时间链接的“长连接”,这个连接在没有接收到服务器或者没有到达连接时间限制时会一直等待服务器的消息,如果服务器有消息传来,立即显示最新信息。长连接每隔一段时间会重新向服务器发出连接请求。服务器在有新消息产生的时候立即检查消息的接收方是否存在长连接,如果存在马上发送,如果没有则不发送。
服务器的comet实现,需要继承HttpServlet类,实现org.apache.catalina.CometProcessor接口,服务器在收到客户端的请求时会调用CometProcessor接口的event方法,把一个org.apache.catalina.CometEvent对象传给event()。CometEvent有四个状态:CometEvent.EventType.BEGIN、CometEvent.EventType.ERROR、CometEvent.EventType.END、CometEvent.EventType.READ。服务器根据请求的状态来向客户端发送相应的数据。
原理大概就是这样,具体实现还需要一个MessageSender来不断的检查消息容器中是否存在数据,有则马上发送,没有就等待;一个connectorCleaner来不断的检查客户端的连接是否超时了,如果超时则断开,等客户端重新发来长连接。
客户端的comet实现,由于浏览器的类型和版本不一致,所以客户端需要实现两种不同的comet,一种是iframe长连接,一种是stream长连接。Iframe用于基于ie内核的浏览器,由于ie内核不支持stream长连接,所以用iframe长连接解决。客户端在向服务器请求数据时,服务器会返回一个带有隐藏iframe的页面,这个iframe每隔一段时间就向服务器发出数据请求以保持长连接,称为“心跳”。Stream是firefox的comet实现,stream支持连接状态的查询,即像CometEvent那样可以查询到连接的状态,并根据状态做不同的操作。Stream长连接将自动与服务器连接,不需像ie内核的浏览器那样需要通过iframe的刷新去重新建立连接。
Apache-tomcat对comet的支持,需要修改server.xml的配置,加入:
<Connector connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
至此comet就能够实现了。