openfire+spark+smack开发流程.docx

上传人:b****8 文档编号:9892565 上传时间:2023-02-07 格式:DOCX 页数:11 大小:22.89KB
下载 相关 举报
openfire+spark+smack开发流程.docx_第1页
第1页 / 共11页
openfire+spark+smack开发流程.docx_第2页
第2页 / 共11页
openfire+spark+smack开发流程.docx_第3页
第3页 / 共11页
openfire+spark+smack开发流程.docx_第4页
第4页 / 共11页
openfire+spark+smack开发流程.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

openfire+spark+smack开发流程.docx

《openfire+spark+smack开发流程.docx》由会员分享,可在线阅读,更多相关《openfire+spark+smack开发流程.docx(11页珍藏版)》请在冰豆网上搜索。

openfire+spark+smack开发流程.docx

openfire+spark+smack开发流程

2010年03月02日星期二上午10:

34

开发你自己的XMPPIM-[J2EE]

最近没在Blog上露脸,为撒类?

应师兄的请求,帮他研究一个XMPPIM软件的开发。

反正最近也没什么大事,每天都想写写代码练练手,就帮忙呗。

研究了一通觉得还挺有趣,自己这几天查国内外的资料,发现国内关于这方面间的软件资料太少了,就想在这里写几篇关于此类IM软件开发的文章。

不过别看东西小,涉及的模块可不少。

所以我基本上分为三篇文章来介绍此类软件的开发:

第一篇是关于XMPP协议是啥,IM是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark、Smack和Openfire);

第二篇讲如何开发基于Spark的客户端IM插件部分;

第三篇讲如何开发基于Openfire服务器端的插件部分。

好了,进入正题吧。

什么是XMPP?

ExtensibleMessagingandPresenceProtocol,简单的来讲,它就是一个发送接收处理消息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是XML。

正是因为使用了XML作为消息传递的中介,Extensible才谈的上,不是么?

嘿嘿。

再详尽的东西,我也就不多介绍了,大家可以去XX百科里查看下。

什么是IM?

InstantMessenger,及时通信软件,就是大家使用的QQ、MSNMessenger和Gtalk等等。

其中Gtalk就是基于XMPP协议的一个实现,其他的则不是。

当前IM几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。

设想既然XMPP协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的IM应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。

说了这么多,就是一个意思,其商业价值远远比你想的高!

SparkSmack和Openfire

开源界总是有许多有趣的东东,这三个合起来就是一个完整的XMPPIM实现。

包括服务器端——Openfire,客户端——Spark,XMPP传输协议的实现——Smack(记住,XMPP是一个协议,协议是需要实现的,Smack起到的就是这样的一个作用)。

三者都是基于Java语言的实现,因此对于熟悉Java的开发者来说不是很难

Spark提供了客户端一个基本的实现,并提出了一个很好的插件架构,这对于开发者来说不能不说是一个福音。

我强烈建议基于插件方式来实现你新增加的功能,而不是去改它的源代码,这样有利于你项目架构,把原始项目的影响降到最低,文章以后的部分也是基于这种插件体系进行开发的

Openfire是基于XMPP协议的IM的服务器端的一个实现,虽然当两个用户连接后,可以通过点对点的方式来发送消息,但是用户还是需要连接到服务器来获取一些连接信息和通信信息的,所以服务器端是必须要实现的。

Openfire也提供了一些基本功能,但真的很基本的!

庆幸的是,它也提供插件的扩展,像Spark一样,我同样强烈建议使用插件扩展的方式来增加新的功能,而不是修改人家的源代码。

Smack是一个XMPP协议的Java实现,提供一套可扩展的API,不过有些时候,你还是不得不使用自己定制发送的XML文件内容的方式来实现自己的功能

下图展示了三者之间的关系:

从图上可以了解到,client端和server端都可以通过插件的方式来进行扩展,smack是二者传递数据的媒介。

开发你自己的XMPPIM续-Spark插件开发-[J2EE]

继续3月18日介绍基于XMPPIM开发的那篇Blog,今天主要总结一下如何基于Spark的插件架构来新增客户端的功能,这里列举出一个获取服务器端群组信息的实际例子,实现后的效果如下图所示:

Spark是一个基于XMPP协议,用Java实现的IM客户端。

它提供了一些API,可以采用插件机制进行扩展,上图中,“部门”部分就是使用插件机制扩展出来的新功能。

要想实现你的扩展,首先要了解SparkAPI的架构,其中最关键的是要了解它的工厂类,这些工厂类可以获得Spark提供的诸如XMPPConnection、ChatContainer等实例,从而你可以实现获取服务器的信息,与另外的Client通信等功能。

最核心的类是SparkManager,这个类是一系列工厂类的工厂类(呵呵,还真拗口)。

它的getChatManager()、getSessionManager()、getMainWindow()、getConnection()等方法分别可以获得聊天管理器、会话管理器、主窗口、与服务器的连接等等非常有用的实例。

基本上可以说SparkManager是你与Spark打交道的衔接口。

其实,每一个Manager都使用了单例模式,你也可以不通过SparkManager来获取它们,但笔者建议你从单一的入口着手,这样有利于代码的开发和维护。

接下来描述一下插件的开发流程:

1、创建插件配置文件plugin.xml

2、实现你自己的Plugin类的实现(如果你需要实现自己规定格式的XML发送、接收和处理,那么你需要在这里注册你的IQProvider,关于IQProvider你可以查询SmackAPI,简单的来讲是处理你自定义的IQ处理器。

3、打包你的插件(Spark有自己的打包机制,我研究了半天才发现其中的玄机,后面介绍)

4、部署你的插件(其实3、4两步可以糅合在一起,当然要利用Ant啦)

好滴,下面结合一个实际的例子讲述上面的四个步骤

1、plugin.xml

   EnterpriseIMClient

   1.0

   Phoenix

   

   phoenixtoday@

   EnterpriseClientPlug-in

   

--关键是这里,这里要定义你的Plugin类-->

   com.im.plugin.IMPlugin

   

--这里定义你使用的Spark最低版本-->

   2.5.0

   Windows

这是一个plugin.xml文件的内容,插件体系会自动调用你在此文件中定义的Plugin类,从而完成你自己扩展的功能。

最关键的部分我用红色标识出来了,要声明你的插件扩展类,采用完整的命名空间方式(包括包名),其余的部分结合我的注释,大家应该都能理解,就不做详细的描述了。

要注意的是plugin.xml文件要放在项目的根目录下,这是严格规定好的。

2、Plugin类的实现

你的类首先要实现Spark提供的Plugin接口,然后实现它的一些方法。

其中最主要的是实现initialize()发放,在这里注册你的的IQProvider

ProviderManagerproviderManager=ProviderManager.getInstance();

providerManager.addIQProvider("groups","com:

im:

group",//1

               newGroupTreeIQProvider());

System.out.println("注册GroupTreeIQ提供者");

requestGroupTree();

上述的代码,就在该类就是我实现的IMPlugin.initialize()方法中的一小段,大概的含义是,先获取ProviderManager(这个貌似不能从SparkManager直接获取),然后注册一个GroupTreeIQProvider(自己创建的)这是一个IQProvider的具体实现,它用于解析像下面这样的一个XML文件:

xmlversion="1.0"encoding="UTF-8"?

>

   

im:

group'>

       

            1

            西安交通大学

            ROOT

            0

            xjtu

            

                1

                phoenix_test

                normal

            

       

       

            2

            电信学院

            1

            1

            xjtuinfo

       

   

可以看到,在注册IQProvider的时候(代码中标注的1部分),需要你提供名称和命名空间,我的XML文件中的iq下的第一个子节点是所以我的名称就写“groups”,命名空间对应于groups节点的xmlns(XMLNameSpace)所以是“com:

im:

group”,其实IQProvider中最关键的方法是parseIQ(XmlPullParserparser)该方法就是解析XML,完成你的功能,并返回一个相应的IQ实例(这里可以把IQ看做一个回馈的Model类)。

说到底实现基于XMPP协议的IM就是解析XML文件,而这正是客户端的IQProvider和服务器端的IQHandler(下一篇文章会涉及到)所做的事情。

3、打包你的插件

现在该有的功能都实现了,那么就是打包了。

这最好利用Ant来完成,因为每次你都要打包,要部署,如果纯手动的话,那也太不敏捷了,大大影响开发效率。

xmlversion="1.0"encoding="UTF-8"?

>

   

   

   

   

       value="E:

/workspace/europa/spark_new/doc/spark/target/build"/>

   

       

--

           

           

           

       -->

   

   

       

--

           

           

           

       -->

   

   

       

--

           

       -->

   

   

--最重要的是这里,打两次包-->

   

       

       

           

               

           

           

               

           

       

   

   

       

--

           

           failonerror="true">

           

"/>

           

           

           

       -->

   

这是我的这个项目的build.xml文件中的内容。

因为Eclipse其实帮我自动完成了编译的任务,所以我也就省去了这写编译的步骤,最重要的是大家要看到“jar”部分,Spark打包的神秘之处也就在此,打两次包首先把你的项目打包到本项目lib文件夹下,比如说你的项目目录是MyPlugin那么,你就将你的类打包到MyPlugin/lib目录下,然后再次的打包,将所有的lib文件夹下的内容打包起来,记得这次要包含plugin.xml。

也就是说,最后Spark插件体系会读取你的项目下的lib文件夹下的内容。

这里我也有个疑问,我本来想每次打包后自动执行bat文件,启动插件,看看效果,为啥死都调用不了呢,那段代码在最后面,注释掉了,谁能帮我解决,我请他吃饭滴!

4、最后就是发布了

其实我的发布很简单,就是将这个打包好的jar文件拷到Spark本身的plugins目录下,每次启动Spark的时候,它会自动调用自定义的插件的。

我这里用Ant第二次jar的时候,就自动拷贝过去了,这里用的是绝对路径,所以你不能直接拷贝就用滴呦(是不是很丑陋呀,这段Ant代码)。

基本上客户端的实现原理就是这样的,只是有些地方需要特别注意,还有就是应该利用像Ant这样的工具大大简化开发步骤,加快开发效率。

还有就是,我建议你在开发自己的插件的时候,多利用MVC模式,尤其是在IQProvider解析后,生成的部分可以实例化Model,然后你可以编写自己的Manager进行这些Model的处理。

多写Log,当然Log4j貌似不太起作用,那就System.out.println()吧,哈哈!

今天就写到这里啦,偶有点累啦。

开发你自己的XMPPIM续-Openfire插件开发-[J2EE]

继续上一篇的内容,本篇文章介绍开发Openfire的插件

这篇文章拖了很久了,呵呵,真是千呼万唤始出来呀。

Openfire服务器端是支持插件开发的,开发过程可能会涉及到数据库的操作,本篇文章专注于Openfire插件的部分,对服务器端涉及到数据库的开发只做简单介绍。

Openfire是一个用Java实现的XMPP服务器,客户端可以通过IQ的方式与其进行通信(其实就是XML),客户端和服务器之间的通信是依靠底层Smack库提供的各种功能来完成的。

其实利用插件方式来扩展Openfire服务器端主要有两种扩展方式,一种是对服务器控制台页面进行扩展(不是本文的主要内容),其实就是遵循Openfire页面的布局方式,进行相应的页面扩展和功能扩展;另一种是对通信功能进行扩展。

本文主要针对后者进行具体的描述

本篇文章的结构如下:

1、创建plugin.xml(这是整个插件最关键的文档)

2、创建服务器插件实例(实现Plugin接口的一个类还有一批IQHandler)

3、打包插件(Openfire插件也有自己的打包方式)和部署插件

好滴,实刀实枪的来动手做吧

1、创建plugin.xml

初次开发Openfire和Spark插件的时候,很容易把二者搞混,千万记得,这里是Openfire的plugin.xml不是第二篇文章说的那个啦!

xmlversion="1.0"encoding="UTF-8"?

>

   

--Mainpluginclass这里是最重要滴-->

   com.im.server.plugin.GroupTreePlugin

   

--Pluginmeta-data-->

   GroupTreePlugin

   Thisisthegroupplugin.

   Phoenix

   1.0

   14/03/2008

   http:

//localhost:

9001/openfire/plugins.jsp

   3.4.1

   gpl

   

--Adminconsoleentries-->

   

       

--Moreonthisbelow-->

   

最重要的那一行我已经标记出来啦,就是你这个插件的初始化和垃圾清理类,例子中是在com.im.server.plugin包中的GroupTreePlugin类,下文会对这个类进行详细描述。

其余的都是描述信息,只要你提供了正确的描述信息,一般都不会出错。

建议初次开发者,在写完plugin.xml文件后,写一个简单的Plugin实例,并打印出一些信息,如果重新启动Openfire信息成功显示,恭喜你,你已经迈出一大步了!

2、实现Plugin类和IQHandler

Plugin类主要起到的作用是初始化和释放资源,在初始化的过程中,最重要的的注册一批IQHandler,IQHander的作用有点类似于Spark中的IQProvider,其实就是解析XML文件之后,生成一些有用的实例,以供处理。

下面分别给出一个Plugin类的实例和IQProvider的实例

GroupTreePlugin类

/**

*服务器端插件类

*

*@authorPhoenix

*

*Mar14,200811:

03:

11AM

*

*version0.1

*/

publicclassGroupTreePluginimplementsPlugin

{

   privateXMPPServerserver;

   /*

    *(non-Javadoc)

    *

    *@seeorg.jivesoftware.openfire.container.Plugin#destroyPlugin()

    */

   publicvoiddestroyPlugin()

   {

   }

   /*

    *(non-Javadoc)

    *

    *@seeorg.jivesoftware.openfire.container.Plugin#initializePlugin(org.jivesoftware.openfire.container.PluginManager,

    *     java.io.File)

    */

   publicvoidinitializePlugin(PluginManagermanager,FilepluginDirectory)

   {

       PluginLog.trace("注册群组树IQ处理器");

       server=XMPPServer.getInstance();

       

       server.getIQRouter().addHandler(newGroupTreeIQHander());//1

       server.getIQRouter().addHandler(newUserInfoIQHandler());

       server.getIQRouter().addHandler(newDelUserIQHandler());

       server.getIQRouter().addHandler(newCreateUserIQHandler());

       server.getIQRouter().addHandler(newAddGroupUserIQHandler());

       server.getIQRouter().addHandler(newSet

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 国外设计风格

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1