第三节我写了有一段时间了,回过头来看发现太粗略,连我自己也不知道在说些什么,所以我决定用图片的形式来把这个模型再阐述一下,愿和更多的朋友来交流。
我设计的Comet模型是很简单的,看下图
简单吧,重点就是采用两个连接,一个长期保持用于接受消息,一个发送消息后立刻关闭。
那么服务器端是如何把消息分发到不同用户的呢?请看下图
全靠内存中保存的这张全局哈希表,通过这张表可以把消息实时的写入用户客户端,那这个HttpContext怎么来的呢?一定有朋友会问。那我告诉你这是微软提供的一个IHttpAsyncHandler接口实现的, IHttpAsyncHandler有个方法需要重载 public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData),通过
context.Request 可以得到Get或者Post的数据,数据中你写上用户名,然后用Hashtable.add(用户名,HttpContext)就行了,AsyncCallback cb是异步结束后给系统发通知的回调。ok有了BeginProcessRequest这把利器,Comet就这么简单的实现了。
题外话:IIS是提供传统Web服务的,虽然对Comet提供了一定的支持,但还存在很多问题,最大的问题就是IIS指不定什么时候就自动重启了,然后进程中所有的数据都丢失了。一般的Web应用没什么,可能都没感觉。但是所有的Comet都掉线了就有点麻烦了,所以客户端要做的强一点才能弥补这个缺陷。