web聊天室

web 聊天室支持多人在线聊天,某个人发了一条消息,在线的所有人都能实时看到。

tornado 自带的 demo 演示了如何实现一个 web 聊天室, 通过源码,我总结一下它设计方案。


服务器端

维护一个消息缓存,用来保存所有人发的消息。

维护一个等待队列,用来保存等待新消息的用户。

如下图所示:

(1) 添加消息

服务器把用户发送的消息加入消息缓存,同时唤醒等待队列中的用户,

告诉它们把最新的消息取走。


(2) 推送消息给用户

服务器与用户保持长连接,如果用户的 cursor 到达了消息缓存的末尾,说明

服务器暂时没有最新的消息,这时让用户一直等待,等待的过程中不关闭用户的连接。

如果服务器有最新的消息,则把用户 cursor 之后的消息一并发送给客户,

然后关闭用户的连接。


客户端

记住自己从服务器上获取了多少消息缓存,用 cursor 来标识。

使用 Ajax 发送消息, 使用 long polling 从服务器获取最新消息。 

long polling 技术

客户端发起一次请求后立即挂起,一直到服务器端有更新的时候,

服务器才会主动推送信息到客户端。 在服务器端有更新并推送信息

过来之前这个周期内,客户端不会有新的多余的请求发生,服务器端

对此客户端也啥都不用干,只保留最基本的连接信息,一旦服务器有

更新将推送给客户端,客户端将相应的做出处理,处理完后再重新发起下一轮请求。

猜你喜欢

转载自kenby.iteye.com/blog/1184517