Flex2基于XMPP的chat程序 (一)

先解释几个名词
XMPP: (eXtensible Messaging and Presence Protocol) XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其他三种分别为:IMPP、PRIM、SIP(SIMPLE)。

XIFF: XMPP Implementation For Flash. (一个ActionScript的XMPP类库)

Openfire: (原名Wildfire) 基于Java的开源实时协作(RTC)服务器,使用XMPP(Jabber)协议。

Google推出的Google Talk就是基于XMPP的IM软件。所以我想使用Flex也开发一个基于XMPP的聊天程序。现在已经有了很好的开源服务器Openfire http://www.igniterealtime.org/projects/openfire/index.jsp 支持中文哦。
另外还有一套XIFF API,专为flash开发XMPP应用,但现在XIFF2.0是用AS2写的,而Flex2是基于AS3的,幸运的是有人已经写了一个基于AS3的实现。http://svn.igniterealtime.org/svn/repos/xiff/branches/xiff_as3_flexlib_beta1/

要开发Flex + Openfire的系统,首先要安装Openfire服务器,安装很简单,具体看安装手册http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html

安装在本机的Openfire启动后,可以通过http://localhost:9090  管理

好,现在开始开发Flex客户端。因为现在XIFF_AS3的文档几乎没有,所以只能通过XIFF2的例子,和Smack API(for java的)来学习。XIFF的核心是XMPPConnection,它基本是围绕flash.net.XMLSocket写的。首先创建一个Flex项目并引入 XIFF.swc

登录服务器比较简单
var connection : XMPPConnection = new XMPPConnection();
connection.server = 服务器名
connection.port = 服务器端口号
connection.username = 用户名
connection.password = 密码
connection.connect("flash");

下面是一个简单的小例子

xml 代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"  
  3.     creationComplete="initApp()">  
  4.   
  5.     <mx:Script>  
  6.         [CDATA[   
  7.             import org.igniterealtime.xiff.events.RoomEvent;   
  8.             import mx.controls.Alert;   
  9.             import org.igniterealtime.xiff.events.MessageEvent;   
  10.             import org.igniterealtime.xiff.core.XMPPConnection;   
  11.             import org.igniterealtime.xiff.conference.Room;   
  12.             import org.igniterealtime.xiff.events.LoginEvent;   
  13.             import org.igniterealtime.xiff.data.*;   
  14.                
  15.             public const SERVER_NAME : String = "wangcheng";   
  16.             public const CHATROOM : String = "chatRoom1";   
  17.                
  18.             private var chatRoom : Room;   
  19.             private var connection : XMPPConnection;   
  20.                
  21.             private function initApp():void {   
  22.                 connection = new XMPPConnection();   
  23.                 connection.addEventListener(LoginEvent.LOGIN, onLogin);   
  24.             }   
  25.                
  26.             private function doLogin():void {   
  27.                 if (!connection.isLoggedIn()) {   
  28.                     connection.username = username.text;   
  29.                     connection.password = password.text;   
  30.                     connection.server = SERVER_NAME;   
  31.                     connection.port = 5222;   
  32.                     connection.connect("flash");   
  33.                     if(connection.isLoggedIn()){   
  34.                         chatContent.htmlText += "Welcome " + username.text + "<br/>";   
  35.                     }   
  36.                 } else {   
  37.                     connection.disconnect();   
  38.                 }   
  39.             }   
  40.                
  41.             private function onLogin(event):void {   
  42.                 inputMsg.enabled = true;   
  43.                 sendBtn.enabled = true;   
  44.   
  45.                 chatRoom = new Room( connection );   
  46.                 chatRoom.setRoomJID(connection.getJID());   
  47.                 chatRoom.roomName = CHATROOM;   
  48.                 chatRoom.nickname = connection.username;   
  49.                 chatRoom.conferenceServer = "conference." + SERVER_NAME;   
  50.                    
  51.                 chatRoom.join();   
  52.                 chatRoom.addEventListener(RoomEvent.GROUP_MESSAGE, groupMessage);   
  53.             }   
  54.                
  55.             private function groupMessage(event):void {   
  56.                 displayUserMessage(getNickName(event.data.from) , event.data.body );   
  57.             }   
  58.   
  59.             private function getNickName(jid : String) : String {   
  60.                 var name = jid.split("/")[1];   
  61.                 if (name == null) {   
  62.                     name = "Message";   
  63.                 }   
  64.                 return name;   
  65.             }   
  66.                
  67.             private function displayUserMessage(user:String, message:String) : void {   
  68.   
  69.                 var fontColor : String = "#002bd2";   
  70.                 if (user == chatRoom.nickname) {   
  71.                     fontColor = "#8e2800";   
  72.                 }   
  73.   
  74.                 chatContent.htmlText += "<font color='" + fontColor + "'><b>" + user + ":</b> " + message + "</font><br />";   
  75.             }   
  76.                
  77.             private function sendMsg():void {   
  78.                 if (inputMsg.text != "") {   
  79.                     chatRoom.sendMessage(inputMsg.text);   
  80.                     inputMsg.text="";   
  81.                 }   
  82.             }   
  83.   
  84.         ]]   
  85.     </mx:Script>  
  86.   
  87.   
  88.     <mx:Label x="10" y="10" text="UserName"/>  
  89.     <mx:TextInput id="username" x="80" y="8" width="92"/>  
  90.     <mx:Label x="180" y="10" text="Password"/>  
  91.     <mx:TextInput id="password" x="244" y="8" width="99" displayAsPassword="true"/>  
  92.     <mx:Button x="351" y="8" label="Login" click="doLogin()"/>  
  93.     <mx:TextArea id="chatContent" x="10" y="36" width="397" height="171"/>  
  94.     <mx:TextInput id="inputMsg" enabled="false" x="12" y="215" width="333" enter="sendMsg()" />  
  95.     <mx:Button id="sendBtn" enabled="false" x="353" y="215" label="Send" click="sendMsg()" />  
  96. </mx:Application>  

 

参考

http://www.dgrigg.com/post.cfm/09/05/2006/XIFF-Actionscript-3-for-Flex-2

你可能感兴趣的:(应用服务器,SVN,Flex,Flash,actionscript)