解析XMPP协议分析与应用
意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 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 结
- 浅析ICS直放站的应用(08-07)
- 基站应用中功放的分立控制和集成控制(04-25)
- 电子标签:RFID技术应用与七大特点(05-12)
- 射频/微波器件面向太空应用可靠性是关键(12-17)
- 以软件为核心的无线测试平台的设计(03-18)
- 高频和微波功率基准及其应用研究(04-12)