前段时间应一个项目需求: 要求给终端短信, 联系人信息做一个云存储云备份及云端远程控制终端并且云端能够推送消息到终端的需求. 这需要在终端与云端建立一个长连接以便云端消息能及时推送到终端. 所以项目中用到了smack框架. smack功能强大, 远不止本文所写的这点内容. 现在我只将对smack的理解以及项目中对smack的使用心得总结并记录下来, 一则给大家分享 , 二则也算是一个技术经验的累积. 但基于我混乱的表达能力和可能的理解上的偏差可能会有些错误. 欢迎各位大虾大牛拍砖.
项目中用到smack的长连接这块关键有以下这几个类: Connection , XMPPConnection , PakcetWriter , PacketReader. 如下图:
查看XMPPConnection源码:
protected void connectUsingConfiguration(ConnectionConfiguration config) throws XMPPException {
String host = config.getHost();
int port = config.getPort();
try {
if (this.socket == null || this.socket.isClosed()) {
LogUtil.i(TAG, "this.socket == null || this.socket.isClosed()");
if (config.getSocketFactory() == null) {
this.socket = new Socket(host, port);
} else {
this.socket = config.getSocketFactory().createSocket(host, port);
}
}
可以看到, connectUsingConfiguration(ConnectionConfiguration config) 是长连接入口, 传递config制定服务器ipAddress和port , 然后根据config创建一个socket对象. 紧接着调用initConnection()方法, 而在initConnection()中:
private void initConnection() throws XMPPException {
usingCompression = false;
// Set the reader and writer instance variables
initReaderAndWriter();
try {
// if (isFirstInitialization) {
packetWriter = new PacketWriter(this);
packetReader = new PacketReader(this);
// If debugging is enabled, we should start the thread that will
// listen for
// all packets and then log them.
if (config.isDebuggerEnabled()) {
addPacketListener(debugger.getReaderListener(), null);
if (debugger.getWriterListener() != null) {
addPacketSendingListener(debugger.getWriterListener(), null);
}
}
// } else {
// packetWriter.init();
// packetReader.init();
// }
// Start the packet writer. This will open a XMPP stream to the
// server
packetWriter.startup();
// Start the packet reader. The startup() method will block until we
// get an opening stream packet back from server.
packetReader.startup();
// Make note of the fact that we're now connected.
connected = true;
以上执行顺序是
1. initReaderAndWriter()方法通过上面创建的socket实例化connection
的Writer和Reader.
2. 实例化PacketWriter和PacketReader对象.
PacketWriter就是向服务器发送数据发送心跳包一直保持与服务器的连接连. PacketReader则是不断的读取并且解析服务器推送的消息.
3. 分别调用packetWriter和packetReader的startup()方法.
至此整个连接过程就建立完成了.
长连接大致流程基本就这样, 也许还是一头雾水.
1.终端如何发生心跳包与服务器一直保持联系的呢.
2.服务器推送消息到终端, 终端是如何根据消息进行分发处理的呢.
请看: smack 源码分析- PacketReader (android上实现长连接) 和
smack 源码分析- PacketWriter (android上实现长连接) 两篇文章.
分享到:
相关推荐
Smack是一个用于实现和XMPP服务器即时通讯的类库,功能包括即时通信和群聊。
smack源码
smack源码下载,java版下载,smack源码下载
这个资料自己也是找了好久,结果发现在官网上有一段错误的代码,自己整下来改改就跑起来了,其实都很简单,就是英文不太好吧,官网说的看的不是很明白,官网上面下载的包不够,所以自己又去别的地方找到了其他包。...
Smack源码,要的拿走,有需要的可以看看,多看源码帮助很大
Android使用smack连接ejabberd服务器,完成了连接、登录、创建新用户、收发消息的功能
这一节中我们着力介绍如何基于asmack开发一个Android的客户端,本篇的重点在实践,讲解和原理环节,大家可以参考前面我所发布的OpenFire和Smack的相关文章。今天所讲解的文章只是 :基于Smack3.0.4+ Openfire3.10.2...
smack4.1 现在支持android 再也不用asmack去修修改改的啦
smack 在4.1.0以后支持android上使用,demo里集成了smack4.1.9在android的使用
基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之三(用户登入、用户注册与XMPP 服务器交互)。
java android openfire+smack项目源码,已测试,修改ip地址后即可直接运行。
用源码开发的时候,需要把smack文件夹下的org文件夹和smackx文件夹下的com文件夹打成jar包导入,源码在source下
基于smack框架。实现了android客户端的注册、登陆、好友添加、好友之间聊天。会议室聊天等功能。
Android smack4.1.4的示例,包括连接,登录,获取好友列表,发送消息等示例
Android上最常用的组合asmack +openfire。Asmack是smack的android版,是对xmpp协议进行了封装,并提供了丰富的api,简化了操作。Openfire是一个开源的IM服务器,基于Xmpp实现。换句话说使用xmpp开发即时通讯应用的话...
最新的 smack4.1.4 android开发demo 可以登录 已验证
Smack is an open source, highly modular, easy to use, XMPP client library written in Java for Java SE compatible JVMs and Android. A pure Java library, it can be embedded into your applications to ...
Smack是一个开源,易于使用的XMPP(jabber)客户端类库。 附件是目前最新版本的smack库,含源码。
基于xmpp smackAndroid 做的即时通讯 适用于初学者,
smack用于android移动端的开发,可以结合openfire使用,进行im通信