Apache Flex是基于MXML和ActionScript的Flash程序设计框架,可以快速开发RIA(富Internet应用)程序,Netty是JAVA实现的高性能的网络通信框架,可以快速构建网络应用的服务端。即时通讯现在已经非常普遍了,本文以简单的WEB版聊天为例浅谈IM系统的设计与原理,最后再探讨下大规模集群下的服务端的瓶颈与解决思路。
1、可用的方案选型
(1)socket
基于浏览器的Flash插件的Socket/XMLSocket,可以采用Flex实现
(2)websocket
HTML5的websocket是非常新的技术,但需要浏览器的支持,面临的问题是老版本的浏览器不可用。
(3)HTTP
基于AJAX的长轮询和基于HTTP流,开源的有Comet架构的Pushlet
(4)JavaFX与Java Applet
本文采用的是方案1,用Flex编写客户端应用,目前我还没有研究如何将Flash与JS的混合,而是完全采用的Flex技术。
关于Flex的学习,我推荐到Apache上去找,也可以通过阅读《Flex实战》学习,我目前还对Flex了解很少,只能进行简单的编程,编写Flex程序前我只看了两天相关的资料,而且只用到了Socket(Flex中的一个知识点),主要还是ActionScript的学习,ActionScript与JavaScript很类似,能看懂JS的应该也能看懂AS,这里不过多描述。
2、通讯协议设计
在即时通讯中使用的协议很多,熟知的有Jabbe/XMPP/SIP等,还有很多私有的自定义协议。协议是双方协定的数据交互规则,具体采用什么样的协议要根据场景和需求,我为了实现通讯功能,简单地设计了一个规则,具体如下:
我的使用场景包括用户的登录、注销、获取通讯录和发送消息,对于应用场景复杂的应该要考虑更多的情况,根据我在工作中的经验,通讯协议不是一下就设计好的,而是在开发过程进行不断修改与完善,可以说没有协议的设计只能遵循具体的原则,没有最终版。
我在工作中原本是基于XMPP开发的,由于做的是移动互联的应用,受限于移动网络的网速,而XMPP的协议过于庞大,对用户的流量需求太高,为此我开始寻找XMPP的替代品,我最开始选的方案是Google的ProtoBuf,类似的还有Apache的Thrift,这两者都是二进制级别的编码,虽然两者的压缩程度和性能都非常好,但在通讯协议方面不太适合,因为编码后没有可读性,出了问题不好定位。后来我在工作选了JSON来设计,相比XML来说拓展性与性能都要好很多。
3、客户端程序设计
客户端采用的是Flex,使用的集成开发工具是IntelliJ IDEA,基于Apache Flex SDK
根据通讯协议的设计进行客户端的开发,具体代码如下:
1、可用的方案选型
(1)socket
基于浏览器的Flash插件的Socket/XMLSocket,可以采用Flex实现
(2)websocket
HTML5的websocket是非常新的技术,但需要浏览器的支持,面临的问题是老版本的浏览器不可用。
(3)HTTP
基于AJAX的长轮询和基于HTTP流,开源的有Comet架构的Pushlet
(4)JavaFX与Java Applet
本文采用的是方案1,用Flex编写客户端应用,目前我还没有研究如何将Flash与JS的混合,而是完全采用的Flex技术。
关于Flex的学习,我推荐到Apache上去找,也可以通过阅读《Flex实战》学习,我目前还对Flex了解很少,只能进行简单的编程,编写Flex程序前我只看了两天相关的资料,而且只用到了Socket(Flex中的一个知识点),主要还是ActionScript的学习,ActionScript与JavaScript很类似,能看懂JS的应该也能看懂AS,这里不过多描述。
2、通讯协议设计
在即时通讯中使用的协议很多,熟知的有Jabbe/XMPP/SIP等,还有很多私有的自定义协议。协议是双方协定的数据交互规则,具体采用什么样的协议要根据场景和需求,我为了实现通讯功能,简单地设计了一个规则,具体如下:
我的使用场景包括用户的登录、注销、获取通讯录和发送消息,对于应用场景复杂的应该要考虑更多的情况,根据我在工作中的经验,通讯协议不是一下就设计好的,而是在开发过程进行不断修改与完善,可以说没有协议的设计只能遵循具体的原则,没有最终版。
我在工作中原本是基于XMPP开发的,由于做的是移动互联的应用,受限于移动网络的网速,而XMPP的协议过于庞大,对用户的流量需求太高,为此我开始寻找XMPP的替代品,我最开始选的方案是Google的ProtoBuf,类似的还有Apache的Thrift,这两者都是二进制级别的编码,虽然两者的压缩程度和性能都非常好,但在通讯协议方面不太适合,因为编码后没有可读性,出了问题不好定位。后来我在工作选了JSON来设计,相比XML来说拓展性与性能都要好很多。
3、客户端程序设计
客户端采用的是Flex,使用的集成开发工具是IntelliJ IDEA,基于Apache Flex SDK
根据通讯协议的设计进行客户端的开发,具体代码如下:
<?xml version="1.0"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script><![CDATA[
import mx.controls.Alert;
var socket:Socket = null;
// 初始化连接
public function conn():void
{
socket = new Socket();
// 增加事件监听处理
socket.addEventListener(Event.CLOSE,closeHandler);
socket.addEventListener(Event.CONNECT,connectHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
// 建立连接
socket.connect('127.0.0.1',8888);
}
// 监听关闭事件
private function closeHandler(event:Event):void
{
trace("closeHandler: " + event);
Alert.show('closed!');
}
// 监听连接成功事件
private function connectHandler(event:Event):void
{
trace("connectHandler: " + event);
// 注册用户
setName();
Alert.show('connected!');
}
// 处理接收消息
private function socketDataHandler(event:ProgressEvent):void
{
var str:String = socket.readUTFBytes(socket.bytesAvailable);
trace("receive data : " + str);
// 沙箱处理
if(str.indexOf("<?xml version=\"1.0\"?>") == 0){