原创,转载请注明出处(@blog.csdn.net/redvalley)。
Web IM,类QQ和MSN,Web(非GUI)实现,支持集群。
要点
1.采用长连接,及时响应消息;
使用Tomcat6的Comet特性
注:Read事件在POST数据情况下发生,GET方式不会产生Read事件。
2.消息机制
参与对象:
用户:User
群:Group
参与者:Peer(群成员)
服务端:
集群主机(A类) 1...n主机(B类)
A----Database
A、B之间通过http/tcp...协议通讯
职责:
A类主机负责数据存取以及产生消息事件;
B类主机传递消息,并根据消息更新自身状态(集群主机同步);
B类主机状态包含:Logined User/Active Group/Group Peer
客户端:
客户端保持对服务器的长连接(setTimeout,确保只有一个连接);
连接返回信息(消息)再分派:系统消息、Group消息...
消息传递:
Client---监听消息(长连接);
B类主机为长连接添加事件监听;
B类主机监听A类主机事件;
Client--->发送请求(普通请求,短连接)--->B类主机接收,转至---->A类主机;
A类主机根据请求处理DB,并fireEvent...--->B类主机接收,B类主机根据Event信息,更新Group/User/Peer信息,并转发给Group/User--->
1)Group接收,遍历Peer,发送给Peer对应的在线User
2)User接收,长连接监听,写消息并close event.(客户端在连接关闭后将再次请求长连接)
3.同账号多次/多处登录限制方法:UserLoginEvent中带B类主机ID,
1)该用户在别的主机已登录:主机检测本机用户--断线处理。
2)本主机重复登录:检查已登录User,把之前登录用户断线。
4.Tomcat6配置:
server.xml,修改为NIO Connector:
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" ...URIEncoding="UTF-8"/>
URIEncoding为URI设置编码(对GET方式生效),POST方式情况增加EncodeFileter。
5.客户端请求:采用Ajax请求,避免页面刷新。