`
xujinquan19
  • 浏览: 150618 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

基于Jabber协议的移动即时通讯系统研究与实现

阅读更多

摘  要  本文利用支持Jabber协议的开源服务器WildFire,在基于J2ME平台的手机上实现了一个移动即时通讯系统,该系统不但具有传统即时通讯的文本信息传递功能,还具备拍照、传递照片、群组聊天以及查看资讯等功能。

    关键字  J2ME;即时通讯;Jabber;WildFire;XML;XMPP
 

 

1  课题研究背景

    移动IM(Instant Message),也就是移动即时信息(即时通信、即时通讯)工具,是移动终端与即时通讯工具的结合。从最初的移动QQ、手机MSN,到陆续出现的“飞信”、“超信”、“灵信”,当然还有不容忽视的PICA,各类型的移动即时通讯工具让用户通过手机就可以与朋友或工作伙伴进行实时交谈、互传信息、娱乐消遣,它们正改变着我们的沟通模式甚至生活习惯。但长期以来各IM软件厂商推出的IM软件相互独立,缺乏基于统一标准的互用性,使得各种IM系统之间无法互相发送信息,例如AOL与Yahoo,MSN与AOL,MSN与QQ等,它们之间就不能相互通信。
    因此,制订一种统一的协议就迫在眉睫,这种统一协议应当可用于E-mail、Web和语音流的简单邮件传输协议(SMTP)、HTTP和实时协议(RTP)等IM应用。由Jabber组织发展的Jabber协议,其中包含支持符合IETF规范的即时消息和Presence技术的基本协议形成了XMPP协议,XMPP(Extensible Messaging and Presence Protocol,即可扩展消息处理现场协议)为用于现场的消息路由处理的XML数据流协议,被确立为IETF标准。
    本文的研究工作正是基于这一背景。(本文缺陷则是未能实现音视频通讯,这块可以在后续的功能扩展中得以改善,考虑引用成熟的视音频平台AnyChat SDK。)

2  总体方案设计

2.1  总体思路

    移动IM采用的是客户/服务器架构的体系结构,具有服务器端和客户端,其中服务器可以分为两个部分:Jabber服务器和数据库系统。服务器采用基于Jabber的开源服务器WildFire 3.0.1,用户数据和系统信息的存储由MySQL数据库实现,客户端J2ME进行开发。

2.2  Jabber与WildFire服务器

    Jabber就像ICQ,MSN一样,是一个基于Internet的即时通讯系统,但是同这些即时通讯软件不同的是,它是一个开放的即时通讯系统,也是一个基于XML Stream 的协议,用于在Internet上的两个实体之间交换信息,现场状态(presence)和其它的结构化信息。你可以自己架设自己的Jabber服务器,使用不同的Jabber Client 软件,而不像ICQ或MSN,依赖于AIM或MSN的服务器和软件。IETF已经将Jabber定为即时通讯和现场技术的标准协议,称为XMPP(Extensible Messaging and Presence Protocol),相关的规范是RFC3920和RFC3921。
    Wildfire是一款获得许多荣誉的Jabber即时消息服务器,采用Java开发,可以使用任何支持Jabber的客户端如psi、gaim等连接。其主要特点有易于安装、管理、定制以及和其它应用程序集成,有基于GPL的开放源代码版本和商业版本。

2.3  J2ME介绍

    J2ME是SUN公司在小型设备上的开发平台,它的主要技术优势在于:良好的跨平台能力与J2EE后端无缝的结合能力和Java语言的优良特色,如简单安全以及现有的Java平台上的开发工具。

3  关键技术研究

3.1  与MSN、OICQ系统通讯

    Jabber服务器中的Transport组件是沟通Jabber和非Jabber协议之间差异的组件。当使用Jabber服务器访问非Jabber系统时,Transport组件隐藏了系统之间的差异,这样,用户在访问的时候根本感觉不到自己访问的是外部的系统。但是,当用户第一次访问非Jabber系统时,需要向Jabber transport注册,注册内容就是用户名和将要使用的外部系统之类的信息。一旦注册成功之后,就可以在外部系统上发送和接收消息。

3.2  网络连接策略

    本文的移动即时通讯系统支持Http和Socket两种连接方式。其中,Socket连接方式为默认连接方式,但是不同品牌和型号的手机以及中国移动各地区网络对Socket的支持有差异,所以当Socket连接不被支持的时候系统会自动切换到HTTP连接方式。
    此外,在国际上,使用Http连接方式通常只有一种GPRS接入方式,但中国有CMWAP和CMNET两种方式。其中CMNET拥有完全的Internet访问权,而中国移动对CMWAP做了一定的限制,主要表现在CMWAP接入时只能访问GPRS网络内的IP(10.0.0.172:80),而无法通过路由访问Internet(少数地区的移动网络可能不存在这一限制)。我们用CMWAP访问Internet就是通过WAP网关协议或它提供的HTTP代理服务实现的。

3.3  拍照及照片传送技术

    客户端通过mobile media api(mmapi)中的videocontrol来实现,通过调用videocontrol的getsnapshot()方法实现。然后,对数据进行base64编码转换为字符串嵌入xml流;服务器收到收据后解码并利用J2ME的Image类还原图像。

3.4  消息传递中编码考虑

    在系统实际开发中,我们通常面临不同的移动终端,有些设备的编码就必须特殊处理。比如,本文采用NOKIA的S60平台机型,NOKIA S60手机在接收ISO8859-1编码时不是与大多数手机那样直接以UTF-8编码方式接收,它只支持ISO8859-1方式接收。但是这种方式接收后,封装在ISO8859-1流中的xml的数据会又一次被进行ISO8859-1编码转换,等于是在对这条封装在ISO8859-1流中的xml语句又封装了一个ISO8859-1的外壳。所以客户端要想得到UTF-8的数据,必须进行两次编码转换,首先剥掉这层ISO8859-1的外壳,得到正常的ISO8859-1数据流,才能向其它机型那样进行正常的ISO8859-1向UTF-8编码的转换。

4  关键模块实现

    本文实现的移动即时通讯系统支持群组消息模式。在群组消息模块中,登录的注册用户可以通过手机来实现传统PC平台的聊天室功能。Jabber的群组聊天或会议机制允许多人同时进行交流,这是对传统即时通讯功能的扩展。具体的业务流程是首先由用户读取群组列表选择登录目标。然后,进行登录并将用户ID注册到这个组中。完成注册后,系统会将本组内的其它成员信息(比如成员列表)发送到当前用户的客户端上。这时系统的会话组件已经为这个群组内地成员做好了消息传递准备,也就是说某个用户的信息可以被服务器传递到群组中的每一个成员。具体的实现过程如下:

4.1  读取群组列表名单

    当用户进入聊天室模块时,客户端首先发送一个xml语句向服务器发出请求,服务器收到后返回一个xml语句,客户端解析后读出聊天室列表,并进行屏幕显示,供用户选择。
发送的xml语句:
<iq id='discoRooms' to='conference.occo' type='get'>
<query xmlns='http://Jabber.org/protocol/disco#items'/>
</iq>
接收的xml语句:
<iq to='605414@occo/p.ne680.13.0' id='discoRooms' from= 'conference.occo' type='result'>
<query xmlns='http://Jabber.org/protocol/disco#items'>
<item maxusers='30' name='绿色军营' jid='10_love@conference.occo' occupants='25'>
</item>
<item maxusers='30' name='缘分天空' jid='20_sky@conference.occo' occupants='18'>
</item>
<item maxusers='20' name='玫瑰情话' jid='30_eye@conference.occo' occupants='8'>
</item>
</query>
</iq>

4.2  用户的在群组中的登记

    需要加入一个指定的群组时(它的ID已经由用户指定或在接到聊天邀请时确定),首先发送一个<presence>元素。注意在发送中不要添加resource名,这是老的groupchat的做法,现在的conference已经不采用了。如果你需要向下兼容性,可以发送resource name。
    接下来,发送包含xmlns=”Jabber:iq:browse”的<iq type=”set”>,这个请求包含了一个或多个<nick>元素,它指明了你希望加入的会议的别名。一旦你接到一个成功回应,也就意味着你已经加入这个聊天室。
    客户端接收成员信息语句:
<presence to='605414@occo/p.ne680.13.0' id='chatlog' from= '20_sky@conference.occo/月儿'>
<icon>16</icon><level>3</level>
<x xmlns='http://Jabber.org/protocol/muc#user'>
<item affiliation='none' icon='16' jid='639139@occo/p.sek700.11.0' role='participant'>
</item>
</x>
</presence>
    当客户端开始接收信息时,就意味指着请求成功了,那么客户端需要建立一个GroupChat实例,并且不断将接收的信息添加到这个实例中。

4.3  群组成员列表的读取

    每个群组都有成员列表,表明当前在群组中的人员。它会随着人员加入或离开而改变。
    本系统通过在GroupChat类中设置一个MUCUser的属性,它是一个Vector的变量,每一个元素都是一个MUCUser实例,存放着每一个聊天室成员的个人信息,如jid、昵称、等级、级别等。客户端每收到一条presence语句,解析后都会更新这个属性。
群组成员的presence语句:
<presence to='605414@occo/p.ne680.13.0' id='chatlog' from= '20_sky@conference.occo/月儿'>
<icon>2</icon>
<level>4</level>
<x xmlns='http://Jabber.org/protocol/muc#user'>
<item role='participant' jid='605414@occo/p.ne680. 13.0' affiliation='none'></item>
</x>
</presence>

4.4  群组中即时消息的发送

    一般来说群组消息传递时有两种最基本的形式,一种是公共消息,就是对所有人发送的信息,这种信息当前群内的所有成员都可以收到;另一种是私有信息,这种信息其实是群中的点对点消息传递,也就是说虽然是在群中,但服务器只会将其发送给群组中指定的成员。在本系统的群组消息模块中,成功的实现了这两种方式。
    群组消息的格式与点对点消息传递的格式基本相同,它们都是通过Message对象进行封装的。它们的区别在于type类型一个是’groupchat’,而另一个是’chat’。服务器端收到消息后,会根据type的值来判断这条消息是否群组消息。下面各给出一条xml语句来说明:
公共消息格式:
<message to='605414@occo/p.ne680.13.0' from='20_sky@ conference.occo/月亮' type='groupchat'>
<body>你好</body>
<x stamp='2006/11/19/  18:21:48' xmlns='Jabber:x:delay'></x>
<x time='2006/11/19/  18:21:48' xmlns='Jabber:x:delay'></x>
<x stamp='20061119T10:23:07' from='733865@occo/ p.n3230.12.0' xmlns='Jabber:x:delay'>
</x>
</message>
私有消息格式:
<message type='chat' from = '605414@occo' to ='30_eye@ conference. occo/太阳'>
<body>hello</body>
<x xmlns='Jabber:x:delay' stamp='2006/11/19/  12:0:16'/>
</message>
    在Gm即时通讯系统中,对于客户端来说,一个聊天室就是一个GroupChat类型的对象,那么加入一个聊天室,本质上就是创建一个GroupChat对象的实例。对GroupChat实例的访问我们可以群组消息传递的所有功能。GroupChat类继承了Chat类,而Chat类又继承至Conversation类,可以说它是一个由一个基本会话类不断扩展而来的,即一个功能更强大的会话类。它的最主要的功能就是对当前聊天室内的成员以及他们的发言进行管理,比如添加新的信息(新的发言)、成员的变更等等。GroupChat还有一个非常重要的方法,就是broadcast()方法。通过这个方法将用户的jid信息,说话的对象,发言的内容等封装为一个标准的Message xml语句,然后交给通讯线程发送出去。
    图1、图2是软件运行的部分功能截图。
   
图1  群组消息传递截图
图2  好友列表读取显示截图

5  结论

    本系统不但实现了传统即时通讯的文本信息传递功能,还具备了拍照、传递照片、群组聊天以及查看资讯等功能。另外,针对国内手机网络和用户的特点和现状,系统对网络连接进行了优化。它能够支持Socket和Http两种网络连接方式,并且当客户端发现当前网络和手机不支持Socket连接时,能够自动切换到Http连接方式。
    此外,本文主要工作在Nokia、Motorola、SE等品牌主流机型都得到实现,整个系统目前运转正常,现注册用户已超过50万,取得了一定的社会和经济效益。

参考文献

[1]. Jabber, Inc. Advantages of Jabber as a Platform for Developing Collaborative Applications, May 2002
[2]. Jabber, Inc. The Presence Value of Presence: Leveraging your Instant Messaging Investment. August,2003
[3]. Shigeoka I. Instant Messaging in Java. 2002
[4]. Peter Saint-Andre. Jabber Technology Overview. Jabber,Inc.,June 2002
[5]. DJ Adams. Programming Jabber, 2002
[6]. Madoka Mitsuoka et al. Instant Messaging with Mobil Phones to Support Awareness, 2001
[7].张弛等. 基于J2ME平台的IPv6 Jabber系统实现. 计算机应用研究, 2005(6)
分享到:
评论

相关推荐

    基于Jabber的IM系统的研究与实现

    本文主要探讨的是基于Jabber协议栈构建的IM系统,该系统利用了开放源代码的XMPP(Extensible Messaging and Presence Protocol)协议进行通信。 **Jabber/XMPP简介** Jabber是最早实现XMPP协议的开源项目,而XMPP则...

    基于XMPP协议的Android即时通信系统设计

    ### 基于XMPP协议的Android即时通信...综上所述,基于XMPP协议的Android即时通信系统设计为用户提供了一个高效、安全、稳定的即时通信解决方案,特别是在移动互联网通信不畅的情况下,为用户提供了更加便捷的通信手段。

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

    通过以上介绍,我们可以看到,基于XMPP协议的多端即时通讯方案不仅能够实现不同即时通信软件之间的互联互通,还能支持多种设备类型,为用户提供更加便捷、高效的沟通体验。同时,选择开源的Openfire作为服务器端,...

    Delphi11.3基于XMPP(JABBER)协议的IM即时通讯客户端源码.zip

    《Delphi 11.3 实现XMPP即时通讯客户端:深入解析与实践》 在当今信息化社会,即时通讯(Instant Messaging,简称IM)已成为人们日常生活中不可或缺的一部分。本篇文章将详细探讨如何利用Delphi 11.3这一强大的开发...

    基于jabber(XMPP)架设内部即时通讯服务

    《构建内部即时通讯服务:基于Jabber(XMPP)的解决方案》 即时通讯服务在当今的数字化工作中扮演着至关重要的角色,它为企业提供了一种高效、安全的内部沟通方式。Jabber,作为一款开源的即时通讯服务器,基于XMPP...

    Android与J2ME平台间即时通信的研究与实现

    ### Android与J2ME平台间即时通信的研究与实现 #### 摘要 随着新一代智能手机平台Android的发布和中国3G网络投入运营,不同智能手机平台间的即时通信(Instant Messaging, IM)应用变得越来越重要。本篇文章详细...

    基于Android的即时通信系统.docx

    ### 基于Android的即时通信系统的实现与关键技术 ...通过使用Jabber协议、Android平台技术和UML建模,该系统具备了良好的用户体验、高度的安全性和强大的可扩展性,为未来的移动即时通信应用提供了有价值的参考案例。

    wp的基于XMPP协议的即时通讯

    标题中的“wp的基于XMPP协议的即时通讯”指的是在Windows Phone平台上开发的,利用XMPP(Extensible Messaging and Presence Protocol)协议实现的即时通信应用。XMPP是一种开放的、基于XML的即时通信协议,广泛用于...

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

    即时通讯(Instant Messaging...通过以上知识点,可以了解到基于XMPP协议的多端即时通讯系统的设计、搭建、实现与应用。从协议本身的优势到实际搭建过程中的细节,都涵盖了建立一个即时通讯系统所需的关键技术和步骤。

    0705030302-尹文博-基于android平台即时通信系统的设计与实现.pdf

    根据提供的文件信息,内容似乎是从一篇关于基于Android平台即时通信系统设计与实现的论文或文档中提取的。文档标题为“***-尹文博-基于android平台即时通信系统的设计与实现.pdf”,其中包含了Android平台的即时通信...

    基于Android的即时通讯源码

    本文将深入探讨基于Android平台的即时通讯源码实现,主要围绕Android即时通讯系统的设计、Jabber/XMPP协议以及毕业设计源码进行详细解析。 一、Android即时通讯系统设计 Android即时通讯系统的核心目标是实现在...

    基于XMPP协议的Android即时通信应用项目源码

    本项目基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种开放标准的即时通讯协议,以其灵活性、可扩展性和安全性被许多开发者所青睐。 【XMPP协议详解】 XMPP是由IETF(Internet Engineering...

    安卓即时通讯基于xmpp

    总之,基于XMPP的安卓即时通讯技术提供了丰富的功能和良好的可扩展性,是实现高效、安全的移动通讯应用的有效途径。开发者在实践中需要关注网络环境、性能优化和安全性等方面,以打造稳定、用户友好的即时通讯应用。

    android 即时通信系统

    本文将深入探讨基于Android Studio的即时通信系统开发中的关键知识点。 一、Android Studio基础知识 Android Studio是Google推出的一款集成开发环境,用于开发Android应用。它提供了丰富的功能,包括代码编辑、调试...

    jxa1.2—jabber开源框架

    Jabber 是一个开放标准的即时通讯协议,它允许用户进行实时通信,包括文字聊天、语音通话、视频聊天等。Jabber 协议基于 XML,因此具有高度的扩展性和灵活性。 **J2ME简介** Java 2 Micro Edition (J2ME) 是 Java ...

    基于Android的移动终端应用程序开发与研究

    例如,文中提到的基于Android平台的即时通信系统,采用了Jabber协议,这是一种开放的标准,允许不同通信协议之间的交互,为用户提供跨平台的沟通体验。 Android应用程序的开发还包括对UI设计、网络通信、数据存储、...

Global site tag (gtag.js) - Google Analytics