- 浏览: 167944 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
dd18349182956:
你这是哪个版本的smack?
smack 源码分析- PacketWriter (android上实现长连接) -
wangshunfan:
跟着思路走,可以写出来!非常感谢!
Android开发笔记-EditText自动补全功能 -
337240552:
...
smack 源码分析- PacketReader (android上实现长连接) -
vasuer:
String jsonStr = request.getPar ...
前台如何将多个json对象传入java后台 -
ly_50:
下载Android SDK时出现Site Authentica ...
在线下载更新Android SDK提示Site Authentication
上一篇smack 源码分析一(android上实现长连接) 整体分析了smack长连接的流程, 本篇将详细介绍PacketWriter.
PacketWriter是在上篇在介绍initConnection()方法中创建的,那么详细看下PacketWriter的实现:
protected PacketWriter(XMPPConnection connection) { this.queue = new ArrayBlockingQueue<Packet>(500, true); this.connection = connection; init(); } protected void init() { this.writer = connection.writer; done = false; lastActive = System.currentTimeMillis(); //开辟一个写网络流数据线程 writerThread = new Thread() { public void run() { writePackets(this); } }; writerThread.setName("Smack Packet Writer (" + connection.connectionCounterValue + ")"); writerThread.setDaemon(true); } /** * 向网络流写数据包 * @param thisThread */ private void writePackets(Thread thisThread) { try { // Open the stream. openStream(); // Write out packets from the queue. while (!done && (writerThread == thisThread)) { Packet packet = nextPacket(); if (packet != null) { synchronized (writer) { writer.write(packet.toXML()); writer.flush(); // Keep track of the last time a stanza was sent to the // server lastActive = System.currentTimeMillis(); } } } synchronized (writer) { while (!queue.isEmpty()) { Packet packet = queue.remove(); writer.write(packet.toXML()); } writer.flush(); } queue.clear(); writer.write("</stream:stream>"); writer.flush(); } catch (IOException ioe) { if (!done) { done = true; connection.packetReader.notifyConnectionError(ioe); } } finally { try { if (writer != null) { writer.close(); } } catch (Exception e) { } } }
在PacketWriter构造方法中传递参数XMPPConnection作为PacketWriter成员变量, 然后调用init()方法 ,而在init()方法中, 开辟一个线程专门用于向服务器写数据. writerPackets()里面是一个无限循环体, 不断的从消息队列queue读取pakcet消息读取完之后调用wirter.flush()方法, 将消息发送的服务器. 这个过程就完成了终端完服务器发送消息的过程.
接下来是, 终端如何与云端保持连接呢, 那肯定是发送心跳包咯. 我们来看下PacketWriter是如何发送心跳包的:
/** * A TimerTask that keeps connections to the server alive by sending a space * character on an interval. */ private class KeepAliveTask implements Runnable { private int delay; private Thread thread; public KeepAliveTask(int delay) { this.delay = delay; } protected void setThread(Thread thread) { this.thread = thread; } public void run() { try { // Sleep 15 seconds before sending first heartbeat. This will give time to // properly finish TLS negotiation and then start sending heartbeats. Thread.sleep(15000); } catch (InterruptedException ie) { // Do nothing } while (!done && keepAliveThread == thread) { synchronized (writer) { // Send heartbeat if no packet has been sent to the server for a given time if (System.currentTimeMillis() - lastActive >= delay) { try { writer.write(" "); writer.flush(); } catch (Exception e) { // Do nothing } } } try { // Sleep until we should write the next keep-alive. Thread.sleep(delay); } catch (InterruptedException ie) { // Do nothing } } } }
心跳发送类: KeepAliveTask 是一个自定义线程, 它定义了心跳发送的时间间隔, 在其run方法里面一个无限循环体每隔delay毫秒就向云端发发送一个空消息(当然, 如需要你可以根据项目需求自定义一个心跳包). 整个PacketWriter介绍基本到此结束, 在你应用登陆成功之后就可以开启KeepAliveTask 线程定时发送心跳包到服务器保持终端与服务器的长连接.
发表评论
-
判断Android系统时间是否是24小时制
2012-05-07 12:04 6282次方法判断Android系统时间是否是24小时制: ... -
rm failed for Gallery3D.apk, Read-only file system
2012-05-02 18:31 0如果你获取了ROOT权限, 使用命令删除系统apk的时候也会报 ... -
在线下载更新Android SDK提示Site Authentication
2012-04-16 18:43 6247在线下载更新Android SDK时会提示:Site Aut ... -
使用AXMLPrinter2.jar批量反编译xml文件
2012-02-25 23:56 9132使用AXMLPrinter2.jar批量反编译xml文件. ... -
eclipse导入的Android项目没有android.jar包并报错
2012-02-15 11:35 9142从网上下载一个项目, 报错. 发现没有导入android.j ... -
[转载]Android UI 的更新及其线程模型
2012-02-06 11:00 1431让我们通过一个交通状 ... -
smack 源码分析- PacketReader (android上实现长连接)
2012-01-11 17:17 3839smack 源码分析- PacketWriter (andr ... -
smack 源码分析一(android上实现长连接)
2012-01-11 15:35 8026前段时间应一个项目需求: 要求给终端短信, 联系人信息做一个 ... -
smack 源码分析一
2012-01-11 14:44 2前段时间应一个项目需求: 要求给终端短信, 联系人信息做一个 ... -
解决SipDroid导入Eclipse报错问题
2012-01-10 11:16 19801. 准备工具: SVN , ANT 2. 操作步骤: ... -
android sqlite查询数据时报错: get field slot from row 0 col -1 failed
2011-12-14 15:02 5067android sqlite查询数据时报错: get f ... -
Android开发笔记-签名认证
2011-10-08 12:32 1637一个android项目开发完成之后要安装到设备上或者放到电子市 ... -
Android开发笔记-EditText自动补全功能
2011-09-08 18:04 15360项目开发之需要, 根据用户拼音或代码检索出用户信息. 现在有 ... -
android开发笔记-sqllite数据库的操作
2011-09-08 17:01 33671.SQLLite简介: 在Android平 ... -
android开发笔记-ListView动态加载数据
2011-08-06 12:31 6951项目开发之需要, 做一个ListView分页显示, 动态加载数 ... -
android开发笔记-Handler的理解
2011-07-25 16:35 8341.Handler的定义: 在主线程中创建, 用于接收子 ... -
android开发笔记-Handler的理解
2011-07-25 16:32 9221.Handler的定义: 在主线程中创建, 用于接收子 ... -
Android常见组件属性详解
2011-07-20 16:07 6151. TextView 属性详解: http://www.cm ... -
Android常见错误代码
2011-07-20 15:50 11961.Installation error: INSTALL_F ... -
基于Google Map API的android地图开发
2011-05-23 22:37 29381. 因为Google Map 类库不是android sdk ...
相关推荐
sqlbuilder.zip,一个用于构建和执行SQL Stasks.SQL Builder库的轻量级库
smack4.1.0的依赖包minidns.jar。可用于smack4.1.3,亲测可用!
peon.zip,一种牡丹,它在后台执行你想扔给它的任何体力劳动任务;一种爪哇牡丹,它在后台执行你想扔给它的任何体力劳动任务。
[Cloud Frameworks]SMACK Big Data Architecture - user guide / [云框架]SMACK大数据架构-用户指南
smack用于android移动端的开发,可以结合openfire使用,进行im通信
jxmpp-core-0.5.0-alpha7 jxmpp-util-cache-0.5.0-alpha7 smack-android-4.1.6 smack-core-4.1.6 smack-extensions-4.1.6 smack-im-4.1.6 smack-sasl-provided-4.1.6 smack-tcp-4.1.6
smack 在4.1.0以后支持android上使用,demo里集成了smack4.1.9在android的使用
smack源码下载,java版下载,smack源码下载
common-jetty-testrunner.zip,此包提供两个测试运行程序-一个用于集成测试(初始化
Smack是一个用于实现和XMPP服务器即时通讯的类库,功能包括即时通信和群聊。
smack源码
smack-im-4.2.2.jar smack-tcp-4.2.2.jar smack-extensions-4.2.2.jar smack-core-4.2.2.jar smack-android-extensions-4.2.2.jar jxmpp-jid-0.6.0.jar jxmpp-core-0.6.0.jar jxmpp-util-cache-0.6.0.jar等jar包
Smack源码,要的拿走,有需要的可以看看,多看源码帮助很大
fast-video-view.zip,用于Android的基于TextureView的VideoView实现。用于Android的基于TextureView的VideoView实现。
smack工具,经修改可以使用.smackcipso smackload smackaccess smackctl
smack源码 android-open-project Google Code开源项目 1、 ZXing 条形码、二维码 2、 K-9 Mail 邮件客户端 3、 Sipdroid SIP/VoIP 客户端 4、 Openintents 提供了大量的应用程序,使用intent,简化开发 5、 Libgdx ...
timplus-smack-tcp-netty 使用Netty网络框架的TCP smack连接的实现。 该库的目的是用于在现有实现与TIM +服务提供者之间建立桥接服务的系统。 在许多情况下,网桥服务可能需要与TIM +服务建立数百个(如果不是数千...
Smack-Openfire im with Android, include heartbeat and auto reconnect 图文详情地址: Smack是一个开源,易于使用的XMPP(jabber)客户端类库。优点:简单的,功能强大,给用户发送信息只需三行代码便可完成。...