`
wangcheng
  • 浏览: 1467104 次
  • 性别: Icon_minigender_1
  • 来自: 青岛人在北京
社区版块
存档分类
最新评论

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

  • 描述: flexchat image
  • 大小: 52.8 KB
分享到:
评论
14 楼 feng_peng2011 2011-07-09  
你好  我用你的程序     可以正常运行,从服务器端可以看到用户已经登陆,可是对话的结果却总是显示不出来   服务器端显示脱机  怎么回事啊

  请楼主指教
13 楼 zhang_xueqin 2008-11-10  
connection.connect("flash");  --这句是什么意思,有人能帮忙解释一下吗,我在自己的机子上装了openfire,中间选择数据库我选的自带的,这个和后面测试没影响吧,我的问题也是连不到服务器, private function onLogin(event):void 这个都不执行,没错误提示,能帮我解答一下哈。
12 楼 liuqiang 2008-06-17  
现在应该导入的包是:import org.jivesoftware.xiff.XXX
11 楼 wangcheng 2008-03-13  
Flex2基于XMPP的chat程序(二)
http://wangcheng.iteye.com/blog/153548
10 楼 kenshinhu 2007-11-20  
当用了smack后,发觉OPENFIRE是没有问题的。。。
如今用JAVA连OPENFIRE也可以,但用XIFF3就不可以了。
你的OPENFIRE的型号是多少?是不是3.4.1?
9 楼 wangcheng 2007-11-20  
登录后,在openfire的控制台应该也能看到用户登录。
8 楼 kenshinhu 2007-11-19  
新建用户后,还是CONNECTION不行。。
                  var connection:XMPPConnection;
                  connection=new XMPPConnection();
       connection.server="kenshinhu";
       connection.port=5222;
       connection.username="abcd";
       connection.password="1234";                     
       trace(connection.connect("flash"));
       if(connection.isLoggedIn()){
       trace("is login");
       }else{
       trace("isn't login");
       }
我是用上面的代码来连接的。
SERVER_NAME是对应OPENFIRE服务上的服务器设置里的服务器名称对吗?我在OPENFIRE上也建了相应的用户了。。
但最后trace出来的值是isn't login咯。。。请求是不是还有别的要设置?
7 楼 wangcheng 2007-11-15  
需要在OPENFIRE新建用户,其实OPENFIRE的用户表就在数据库里。
6 楼 kenshinhu 2007-11-14  
请问在OPENFIRE上怎样设置,要不要新建用户??
我试过CONNECTION去OPENFIRE,在和OPENFIRE下设的用户和密码一样下,也连不上,请问是怎样一回事?
5 楼 wangcheng 2007-09-25  
呵呵,谢谢楼上几位,有时间我会继续的。大家共同学习。
4 楼 davidzhang 2007-09-25  
谢谢,跟进中~~~~

像我这种脾气,心里的事得憋三天那是多么痛苦啊!呵呵
3 楼 goinggone 2007-09-25  
@davidzhang,
"新会员不能留言和评论" - 同感。三天后才能留言,使我见过的最恶心的限制。
可以到这里看看
http://www.igniterealtime.org/community/community/developers/xiff?start=0&view=discussions
里面有些例子。
2 楼 goinggone 2007-09-25  
wangcheng,多谢好文章,期待后续。
1 楼 davidzhang 2007-09-24  
你好,前几天路过,看到你的这篇文章.很感兴趣,于是就赶快注册,为了给你留言,可是这个破地方新会员不能留言和评论,很愤怒,但为了知识和技术,把这件事埋藏在心里三天之久.

我按着你的方法做了,又花了一些的时间研究了openfire和关于xiff,很遗憾没有正式为as3的版本.

我花了一个下午来实验你的方法,代码里有一些警告和错误,已经修改,可以正常运行,从服务器端可以看到用户已经登陆,可是对话的结果却总是显示不出来.在velloff的代码里面debug,发现你的程序的流程有一些问题,可惜velloff的那个as3的xiff没有说明文档和例子,未果~~~

带着多样的心情,给你留言,希望能有更好的机会一起探讨~~

期待你的下一篇文章.

我的hotmail和email是:maple_zl@hotmail.com

相关推荐

    Flex2基于XMPP的chat程序(二)

    swf文件 博文链接:https://wangcheng.iteye.com/blog/153548

    Flex实现的xmpp消息发送接收

    Flex是一种基于Adobe Flash Player或Adobe AIR的开源框架,用于创建富互联网应用程序(RIA)。它提供了丰富的用户界面组件和强大的数据连接能力,适用于构建跨平台的桌面和移动应用。在这个特定的场景中,"Flex实现...

    android xmpp chat 聊天程序

    在Android平台上构建XMPP聊天应用程序是一项常见的任务,XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛用于即时通讯应用。本文将深入探讨如何利用Android技术和XMPP协议来...

    基于XMPP的即时通信程序

    本项目“基于XMPP的即时通信程序”着重于使用XMPP(Extensible Messaging and Presence Protocol)协议来构建这样一个系统。XMPP是一种开放标准的协议,最初由Jabber项目开发,现已被IETF标准化,广泛应用于多种实时...

    基于xmpp的安卓客户端高仿QQ

    在这个“基于xmpp的安卓客户端高仿QQ”项目中,开发者利用XMPP技术来创建一个类似于QQ的移动应用程序,让用户体验到类似的功能。 首先,让我们深入了解一下XMPP的核心概念。XMPP基于XML流,通过TCP连接提供稳定的...

    基于XMPP协议的Qt聊天程序

    【基于XMPP协议的Qt聊天程序】是一种使用XMPP(Extensible Messaging and Presence Protocol)标准进行即时通讯的应用,它的设计和实现充分利用了Qt库的强大功能。XMPP是一种开放且基于XML的通信协议,广泛用于即时...

    基于XMPP的聊天项目

    【基于XMPP的聊天项目】是一个使用Android平台开发的聊天应用程序。XMPP(Extensible Messaging and Presence Protocol)是一种开放标准的即时通讯协议,它基于XML流传输,常用于实现聊天、在线状态管理等功能。这个...

    基于XMPP的webIm 实现

    基于XMPP协议的WEBIM 简单实现,如有开发openfire+spark/jwchat的可以参考

    基于XMPP实现android客户端与服务器的交互(服务器、客户端源码)

    XMPP是一种开放标准,主要用于即时消息传递和在线状态跟踪,它基于XML流,使得数据传输更为灵活且易于解析。 标题“基于XMPP实现android客户端与服务器的交互”指出了我们的重点:使用XMPP协议在Android应用中实现...

    基于xmpp协议的多端即时通讯方案

    XMPP协议是一种基于XML的开放标准协议,用于实时通信和在线状态管理。它最初被称为Jabber协议,后来更名为XMPP。该协议的主要目标是实现不同即时通信服务之间的互操作性和可扩展性。 ##### 2、Xmpp协议内容 XMPP...

    基于xmpp协议的gloox底层库开发的即时通讯qtalk源码

    【基于XMPP协议的Gloox底层库开发的即时通讯Qtalk源码】是一个使用C++编写的项目,它利用了Gloox库来构建一个即时通讯应用。Gloox库是一个开源的实现,完全遵从XMPP(Extensible Messaging and Presence Protocol)...

    IM 基于XMPP协议

    本文将深入探讨基于XMPP(Extensible Messaging and Presence Protocol)协议的IM系统,以及如何在iOS平台上实现一个类似QQ的即时通信功能。 XMPP是一种基于XML的开放标准,最初设计用于即时通讯,但后来扩展到更...

    基于XMPP协议一套Socket通信程序(C/S都带,VS2013打开,可学习,也可直接使用,物超所值)

    总之,这套基于XMPP协议的Socket通信程序不仅提供了一个学习即时通讯协议和Socket编程的好例子,还具备了在复杂网络环境下的适应性。通过深入理解和实践,开发者可以提升网络通信领域的专业技能。

    基于XMPP协议的简单IM实现的Demo(iOS)

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,被广泛应用于即时通讯(IM)领域。本教程将介绍如何在iOS平台上利用XMPP协议开发一个简单的即时通讯应用Demo。首先,我们需要理解...

    Android基于XMPP的仿微信微客服项目

    本项目就是基于XMPP来创建一个Android版本的微客服系统,旨在提供基础的聊天和用户状态服务,同时也为开发者提供了扩展和自定义的空间。 首先,让我们深入了解XMPP。XMPP的核心设计是基于XML流,它允许客户端与...

    基于xmpp协议的多端即时通讯

    1. 什么是Openfire:Openfire是一个开源的即时消息服务器,它基于XMPP协议,支持各种即时通讯客户端。 2. 为什么使用Openfire:Openfire易于配置、安装和维护,具有较好的性能,适合用于创建服务器端的即时通讯解决...

    IOS XMPP 聊天程序客户端

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通讯协议,常用于构建即时通讯应用,如聊天软件。在iOS平台上开发XMPP聊天程序客户端,通常需要对XMPP框架有深入理解,并熟悉iOS的网络编程...

Global site tag (gtag.js) - Google Analytics