安卓xmpp简单介绍(登录)以及自签名证书的使用
概念
OSI七层模型
开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。
它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,具体参考[百度百科]。
![](https://img-my.csdn.net/uploads/201208/07/1344351176_4808.jpg)
七层模型的介绍网络上很多,这里不浪费篇幅,主要给初学者举几个例子,可能印象更深,初级java开发常接触到的协议以及所属的层分别为:
IP(Internet Protocol)-网络层
TCP(Transmission Control Protocol)-传输层
UDP(User Datagram Protocol)-传输层
SSL(Secure Sockets Layer)-传输层和应用层之间
TLS(Transport Layer Security)-传输层和应用层之间
HTTP(HyperText Transfer Protocol)-应用层
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)-应用层
FTP(File Transfer Protocol)-应用层
SFTP(Secure File Transfer Protocol)-应用层
TELNET-应用层
DNS(Domain Name System)-应用层
XMPP
Extensible Messaging and Presence Protocol,(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。它在促进服务器之间的准即时操作。
这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。属于应用层范畴,在TCP或TLS之上进行数据的封装。
安卓应用支持xmpp
asmack(客户端)
asmack是一个开源软件,支持在安卓应用上封装实现xmpp协议的交互功能。近期由于smack在4之后支持了安卓,因此smack自2015年2月后不再更新,
asmack只有一个jar包,因此集成比较方便,本文示例代码仍旧以asmack为例(与smack大同小异)。
jar和源码:http://asmack.freakempire.de/4.0.7/
openfire(服务端)
openfire是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
下载地址:https://www.igniterealtime.org/projects/openfire/
协议的介绍
网络上很多,本文不再赘述,贴几个随手能搜到的帖子:
XMPP-百度百科
XMPP协议实现原理介绍
示例代码
初始化
config = new ConnectionConfiguration(host, port, serviceName);
config.setDebuggerEnabled(true);
config.setCompressionEnabled(false);
config.setReconnectionAllowed(true);
config.setSecurityMode(SecurityMode.disabled); // 是否开启TLS
SASLAuthentication.registerSASLMechanism("MyMechanism", MyMechanism.class);// 新增自定义的登录校验机制
SASLAuthentication.supportSASLMechanism("MyMechanism", 0); // 设置登录校验器的序号,序号小的会优先选择
serviceName即openfire的domain,可以在openfire管理台上查到,一般为计算机名。
asmack默认集成了”DIGEST-MD5”、”PLAIN”、”ANONYMOUS”等几种校验器,具体参考源码:SASLAuthentication.java
登录
connection = new XMPPTCPConnection(config);
connection.addPacketListener(new PacketListener()
{
@Override
public void processPacket(Packet packet)
{
processReceivedMessage(packet);// 接收消息后的处理,可以根据消息类型做业务逻辑
}
}, new PacketFilter()
{
@Override
public boolean accept(Packet packet)
{
return true;
}
});
connection.connect();
connection.login(userName, password, resource);//resource为资源名,可以为空。
连接相关操作不能在主线程中进行。