首先,这个聊天室是公司产品里的一个功能模块,期间经过了多次改造,最终成型,在速度和性能上都有很大的提升。借此,感谢一下领导的信任和技术支持。废话不多说,进入正题。 :D

完成的功能点:

1、能支持单聊和群聊功能
2、单聊时应该提供新消息提醒及聊天用户在线提示
3、用户登录实时刷新列表
4、提供简单的表情输入
5、单聊支持多人同时聊天
6、当聊天信息达到一定数量时清除一定数量的信息

系统使用到得组件及环境
jdk 1.6 tomcat 6 memoryCache(放到application也可以实现本部分的功能)

首先,我们先来探讨单聊的情况,群聊其实和单聊技术一样,而且要简单的多,因此主要
介绍单聊的情况。
当用户点击某人进入聊天室的时候,服务器会根据登录用户到cache服务器去获取是否已经创建于该用户的聊天通道ChatChanal(该对象封装了消息列表和一些标志属性,识别的标志为:接受方用户ID+"_"+聊天发起方ID),如果不存在,则创建该通道,同时初始化聊天信息列表的index。
用户就进入了与该用户的聊天窗口,页面左边会发送ajax请求在线列表,并定时请求以刷新在线用户列表信息,当用户填写完信息(在此输入框纯粹是一个文本输入框,因此无法图文显示),点击发送按钮后,服务器端获得聊天信息及接受方,首先检查接受方是否在线,如果不在线提醒用户,接受方在线则根据传递过来的参数构建聊天信息对象(期间还做了敏感词过滤),并放入通道的聊天信息列表中。通知检查消息更新线程继续检查。至此发送消息完毕。
页面定时想服务器检查与该用户的聊天信息是否应经更新(说明一下:我们不是每次都想服务器直接请求消息,是因为效率及性能问题,当请求响应没有消息更新后会锁住线程,直到有新消息发送,这样避免了不断的请求而带来的性能问题,另外我们在session中都设置了与该用户聊天的索引,标志为接受方ID+”_“+索引值,这样每次请求不是请求所有消息,而是请求未请求过的消息,页面消息显示也是动态增加的)
当检查有聊天信息出现更新时,将请求新消息,并动态添加到页面显示,服务器端接到请求后会根据索引号获取索引号以后的消息(其中有对表情的处理),然后会对该通道的消息列表进行更新检查(如果大于100并且俩人都读了签50条信息则清除前50条并更新索引)

至此起本的大体思路就是这样了,其中刚开始将消息通道放到memCache中,这样速度不仅没有提高,而且每次唤醒该检查线程后,都不是同一个消息通道,后来将通道放到了application,这样速度反而快了。而且也能正常唤醒检查消息更新的线程了。

本人只是实习菜鸟,写得不好,老鸟飞过。只是给大家提供一个思路。往后会陆续发出源码,跟大家探讨。希望大家都能有点启发,同时也巩固一下自己。呵呵。。。 :D