微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 解析XMPP协议分析与应用

解析XMPP协议分析与应用

时间:09-16 来源:互联网 点击:

意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和 MAC 密钥。TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。

TLS协议框架主要有2个层次的协议:TLS握手协议和TLS记录协议。TLS握手协议用来让服务器与客户在传输应用层数据之前交换TLS协议版本信息、协商加密算法、进行(相互)身份认证并交换密钥。TLS记录协议用来将应用层提供的信息进行分组、压缩、数据完整性检查和加密。数据完整性检查通过比较传输前后使用安全散列函数(如SHA和MD5 等)计算出来的数据的MAC值是否一致来完成。数据加密采用对称密码算法(如R4和DES等)。对数据进行完整性检查和加密的密钥由TLS握手协议来协商。

XMPP中采用的STARTTLS扩展处理流程如下(C:客户端,S:TLS服务器):

(1)C、S之间建立XML流会话连接。

(2)S 向C 发送STARTTLS扩展服务需求及支持的其他认证机制列表,代码实例如下:

stream:features>

starttls xmlns=′urn:ietf:params:xml:ns:xmpp-tls′>

required/>

/starttls>

mechanisms xmlns=′urn:ietf:params:xml:ns:xmppsasl′>

mechanism>DIGEST-MD5/mechanism>

mechanism>PLAIN/mechanism>

/mechanisms>

/stream:features>

(3)C发送STARTTLS命令给S。

(4)C、S中TLS握手协议开始协商相关加密算法及密钥。

(5)若TLS握手协议协商成功,则关闭当前XML流会话,C发起一个新的XML流会话,所有传送的信息均被TLS记录协议加密。TLS握手协议协商不成功则发出警告信息。

(6)S向C回复新XML流会话。

4 客户端程序设计中的关键问题

由于网络中已存在大量的XMPP服务器,在一般的应用开发中,只要设计自定功能的客户端程序即可,并可以选用Smack库来加速开发。

(1)创建一个XMPP连接。因为XMPP使用TCP协议,所以首先必须创建一个网络连接,XMPPConnection就是Smack库用来创建与XMPP服务器连接的类,创建一个XMPP连接的代码如下:

XMPPConnection connection=new XMPPConnection(″jab-

ber.org″);

如要创建加密连接,可以使用SSLXMPPConnection类:

XMPPConnection connection=new SSLXMPPConnection(″jabber.org″);

(2)登录。TCP连接创建后,需要使用用户名和密码登录到XMPP服务器,登录程序可以使用XMPPConnection.login(String username,String password)方法。登录后就可以和其他人聊天。

connection.login(″yb″,″password″);//connection为已创建的XMPP连接,下同

connection.createChat(″yb@sdpt.com″)。sendMessage

(″Hello!″);

(3)操作名册。每个用户都包括:一个XMPP地址(如mailto:%E2%80%9Cyb@sdpt.com”)、名称或昵称(如″yb″),及其所属列表(如好友、同事等)。名册能够跟踪好友或某用户组是否在线及其状态信息,登录后,可以使用Roster类来取得好友或某用户组的状态,代码如下:

Roster roster=con.getRoster( );

for (Iterator i=roster.getEntries( );i.hasNext( ); ) {

System.out.println(i.next( ));}

名册信息通常是随时变化的,可能需要增加或删除。要监听名单及其在线状态的改变,可以使用RosterListener。

(4)发送和接收消息。发送接收消息可以使用Chat和GroupChat类。下面介绍如何使用Chat发送文本消息,GroupChat的使用方法类似。

Chat newChat=connection.createChat(″yb@sdpt.com″);//创建新Chat

newChat.sendMessage(″Hello!″);//发送消息″Hello!″

利用Chat.sendMessage( )方法可以方便地创建一个消息对象,它的参数就是消息内容,执行后消息会发送出去。

Chat newChat=connection.createChat(″yb@sdpt.com″);

newMessage.setBody(″Hi, I′m waiting for you.″);

while (true) {

Message message=newChat.nextMessage( );//等待对方发送消息

newChat.sendMessage(message.getBody());//把对方

}//发送来的消息发回去

(5)修改状态。要修改状态可以用presence.Type.UNAV-ILABLE作为参数创建一个presence,状态将改变为不在线状态。

Presence presence=new Presence(Presence.Type.UNAVAILABLE);

presence.setStatus(″Gone skating″);

5 结

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top