之前的聊天室存在几个问题:
1.基于请求响应模型很难实现RIA,大部分工作和压力还是在服务器端,客户端无非就负责定时发送AJAX请求再显示
2.对于RIA的要求,使用JS,即使采用一些AJAX FRAMEWORK,后期代码仍然会难以维护.针对自己来说,即使是对JS比较熟悉,但因为和JAVA语言类型的不一致,在编程的风格以及规范上还是无法做到和JAVA一样的专业.
基于这2个问题,我选择使用FLEX来代替HTML实现RIA.同时FLEX对JAVA的支持非常好,提供了多种通信方式(甚至采用AJAX bridge能和JS进行交互),并且使用AS的话,语法,编码规范很相似,甚至也提供了实现MVC的 FRAMEWORK.那么,改造后的聊天室,JAVA只实现后台部分,前台全部由FLEX处理.
基本如下:
改动的地方其实也并不多,实现思路如下:
1.在服务器端专门建立一个JAVABEAN充当向FLEX发送消息的JSON对象,如下:
public class ChatUserJson {
private String channel;//频道
private String from;//发送方
private String toWho;//接收方
private String content;//内容
.......
}
2.取消让新用户看到之前消息的功能,每次在接收聊天信息的处理中都将当前用户聊天索引号和当前聊天集合中最大的索引号作比较,如果前者小于后者,则表示有新的信息发出.这时才将这条新的消息以JSON的格式返回给客户端.
3.客户端如果接收到JSON格式的数据,则使用JSON.decode进行转化,然后做字符串的解析
4.分频的实现:解析聊天信息字符串时按频道将信息放入对应的数组,需要时从数组中取出,同时定时清除数组元素
这样做了之后,首先服务器压力减少很多,每次只发送1条消息,处理字符串的工作由客户端来完成.同时,使用FLEX,只需要下意识地按MVC稍微对代码分下层就很容易扩展和维护.
存在的缺陷:FLEX目前的版本对图文混排支持很不好,使用TextArea的话,对<img标签的处理是自动换行,因此表情的实现很困难.其次,由于聊天信息集合是放在APPLICATION,因此集群时无法获得.解决的办法:对于第1点可以等待新版本的FLEX(据说有个TEXTVIEW组件专门实现图文混排)或者更换表现思路(采用容器嵌套组件的形式 每段话每个图片都解析后生成相应的组件动态添加到一个容器内 只不过实现起来很复杂 还需要自己计算宽度和高度以控制格式).对于第2点,可以将聊天从整个系统中分离出去,或者不使用应用服务器级别的CACHE.