客户端:
服务器:
服务器:
Neither, fair saint, if either thee dislike. 服务器: 客户端: 服务器:从以文档的观点来看,客户端或服务器发送的所有XML文本连缀在一起,从
在使用XMPP(Jabber)协议的时候,一般不需要从底层重新实现协议细节,为了 “不重复制造轮子”,而选用Java编写的Smack API。
Smack是一个开源,易于使用的XMPP(jabber)客户端类库。它具有如下优点[23]:
(1)Smack是一个简单的,功能强大的类库。给用户发送信息只需三行代码便可完成:
XMPPConnection connection = new XMPPConnection(”jabber.org“); connection.login(”mtucker”, “password”);
connection.createChat(”jsmith@jivesoftware.com“).sendMessage(”Howdy!”);
(2)不会强迫你向其他类库那样,在信息包层面进行编码。它提供了更加智能化的类比如Chat和Groups,能使你的工作更富效率。
(3)不需要你熟悉XMPP XML格式,甚至是XML格式。 (4)易于实现机--机对话。
17
(5)Apace License下的开源软件。你可以把它用于你的商业或非商业应用程序。
Smack API封装了底层通信细节,并提供相对应的应用接口。在实际应用时,开发者只需要调用或实现相应接口即可。 6.3 服务端的设计 6.3.1 Openfire简介
图9 openfire数据库部分Tables
图10 openfire数据库配置信息
由于Openfire在同类产品中已经很成熟,所以我们选用它作为服务端实现。
18
首先来关注一下,官方网站(http://www.igniterealtime.org)对它的定位[22]。
Openfire is a real time collaboration (RTC) server licensed under the Open Source GPL. It uses the only widely adopted open protocol for instant messaging, XMPP (also called Jabber). Openfire is incredibly easy to setup and administer, but offers rock-solid security and performance.
由此可见,Openfire作为一款遵循GPL协议,使用XMPP协议通信的即时通信服务端,在功能上并不逊于同类的商业软件。 6.3.2 Openfire的整合设计
服务端主要由服务器组件和数据库组成。而Openfire已经内置了对数据库实体关系的设计以及数据库的相关配置。如用户表、用户信息表、用户电子卡片表、好友关系表??,如图9和图10。
与原有的客户数据断连是使用Openfire设计的数据库的一个缺点[23]。如果想使用现有系统的用户/组(部门),而不想使用openfire再去管理一套用户/组,那利用openfire对JDBC Provider的支持可以非常方便的整合现有系统用户。具体操作如下:
进入openfire管理控制台—服务器-服务管理器-系统属性可以发现如下配置:
provider.auth.className
org.jivesoftware.openfire.auth.DefaultAuthProvider
*用户验证
provider.group.className
org.jivesoftware.openfire.group.DefaultGroupProvider
*获取组相关数据 provider.user.className
org.jivesoftware.openfire.user.DefaultUserProvider
*获取用户相关数据
这些Provider是openfire默认自己管理用户组。但同时openfire还提供了支持JDBC相关的Provider,可以从其它的数据源获取用户/组数据。将上面
19
三个属性分别修改为:
org.jivesoftware.openfire.auth.JDBCAuthProvider org.jivesoftware.openfire.group.JDBCGroupProvider org.jivesoftware.openfire.user.JDBCUserProvider
然后,需要配置一下数据源,添加如下属性
jdbcProvider.driver *数据源驱动
jdbcProvider.connectionString *连接字符串
对每一个JDBC Provider需要配置相关的SQL语句和属性(在系统属性里添加项目)。
JDBCAuthProvider
jdbcAuthProvider.passwordSQL *获取用户密码的SQL *输入参数:登录名 *输入列:密码
*例:SELECT pwd FROM user WHERE name=? jdbcAuthProvider.passwordType
*密码类型可以是:plain(文本),md5,sha1
*如果你的密码加密不为以上三种,就需要自己提供一个AuthProvider JDBCGroupProvider
jdbcGroupProvider.allGroupsSQL *获取所有组的SQL *输入参数:无
20
*输出列:组的KEY
*例:SELECT sn FROM department
jdbcGroupProvider.descriptionSQL *获取组的名称(描述) *输入参数:组记录的KEY *输出列:组的名称(描述)
*例:SELECT name FROM department where sn=?
jdbcGroupProvider.groupCountSQL *获取组的数量 *输入参数:组的KEY *输出列:组的数量
*例:SELECT count(sn) FROM department
jdbcGroupProvider.loadAdminsSQL *获取组的管理员 *输入参数:组记录的KEY *输出列:组管理员的KEY
*例:SELECT admin FROM department where sn=?
jdbcGroupProvider.loadMembersSQL *获取组的成员 *输入参数:组的KEY
*输出列:组成员的KEY(集合)
*例:SELECT usersn FROM department_user where departmentsn=?
jdbcGroupProvider.userGroupsSQL *获取成员的组
21