- 浏览: 170881 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 源码分析- PacketWriter (android上实现长连接) 介绍完PacketWriter 之后, 接下来分析PacketReader. PacketReader的作用主要用来接收云端推送的消息并解析然后调用相应的监听器完成相关的操作.
什么都别说, 先看代码:
//构造函数 protected PacketReader(final XMPPConnection connection) { this.connection = connection; this.init(); } /** * Initializes the reader in order to be used. The reader is initialized * during the first connection and when reconnecting due to an abruptly * disconnection. */ protected void init() { done = false; connectionID = null; //开辟一个线程, 解析收到的数据包 readerThread = new Thread() { public void run() { parsePackets(this); } }; readerThread.setName("Smack Packet Reader (" + connection.connectionCounterValue + ")"); readerThread.setDaemon(true); // Create an executor to deliver incoming packets to listeners. We'll // use a single // thread with an unbounded queue. listenerExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() { public Thread newThread(Runnable runnable) { Thread thread = new Thread(runnable, "Smack Listener Processor (" + connection.connectionCounterValue + ")"); thread.setDaemon(true); return thread; } }); resetParser(); } /** * Parse top-level packets in order to process them further. * * @param thread the thread that is being used by the reader to parse * incoming packets. */ private void parsePackets(Thread thread) { try { int eventType = parser.getEventType(); do { if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("message")) { processPacket(PacketParserUtils.parseMessage(parser)); } else if (parser.getName().equals("iq")) { processPacket(PacketParserUtils.parseIQ(parser, connection)); } else if (parser.getName().equals("presence")) { processPacket(PacketParserUtils.parsePresence(parser)); }
构造函数和init()方法PacketWriter一样, 不多说了. 直接看parsePackets(). 在parsePackets()是直接调用processPacket()方法解析, 我们再来看processPacket()方法:
/** * Processes a packet after it's been fully parsed by looping through the * installed packet collectors and listeners and letting them examine the * packet to see if they are a match with the filter. * * @param packet the packet to process. */ private void processPacket(Packet packet) { if (packet == null) { return; } // Loop through all collectors and notify the appropriate ones. for (PacketCollector collector : connection.getPacketCollectors()) { collector.processPacket(packet); } // Deliver the incoming packet to listeners. listenerExecutor.submit(new ListenerNotification(packet)); }
在processPacket()的最后一行是通过ExecutorService类型的一个listenerExecutor实例执行一个线程ListenerNotification完成的. 接下来:
/** * A runnable to notify all listeners of a packet. */ private class ListenerNotification implements Runnable { private Packet packet; public ListenerNotification(Packet packet) { this.packet = packet; } public void run() { //循环读取注册了的监听器并通知处理packet for (ListenerWrapper listenerWrapper : connection.recvListeners.values()) { listenerWrapper.notifyListener(packet); } } }
在ListenerNotification的run方法中, 是循环读取connection.recvListeners.values()获取ListenerWrapper .
那么ListenerWrapper 是什么呢? 我们首先来看这里connection.recvListeners.values(), 这connection实际上
是一个XMPPConnection的一个实例, 而XMPPConnection继承了Connection, recvListeners实际上是Connection
的一个成员变量. 然后再来看ListenerWrapper类:
/** * A wrapper class to associate a packet filter with a listener. * */ protected static class ListenerWrapper { private PacketListener packetListener; private PacketFilter packetFilter; /** * Create a class which associates a packet filter with a listener. * * @param packetListener the packet listener. * @param packetFilter the associated filter or null if it listen for * all packets. */ public ListenerWrapper(PacketListener packetListener, PacketFilter packetFilter) { this.packetListener = packetListener; this.packetFilter = packetFilter; } /** * Notify and process the packet listener if the filter matches the * packet. * @param packet the packet which was sent or received. */ public void notifyListener(Packet packet) { if (packetFilter == null || packetFilter.accept(packet)) { packetListener.processPacket(packet); } } }
ListenerWrapper类实际上是一个包装类, 该类的作用是将packetListener 和packetFilter关联在一起. 那么
packetListener 和packetFilter分别是什么嗯, 查看smack帮助文档可知:
Smack提供灵活的框架来通过两种构造处理收到的 packet:
- org.jivesoftware.smack.PacketCollector —— 一个让您同步等待新packet的类。
- org.jivesoftware.smack.PacketListener —— 一个异步通知您引入的packet的接口。
packet监听器用于事件样式的编程,而packet收集器有一个可以做轮询和阻塞操作的packet的结果队列。 所以, 当您想对一个有可能随时到来的packet采取一些操作时,使用packet监听器;而当您想等待一个特别的packet到来 时,使用packet收集器。您可以使用XMPPConnection实例创建packet收集器和监听器。
org.jivesoftware.smack.filter.PacketFilter 接口决定哪个特别的将会被传递 到PacketCollector或PacketListener。org.jivesoftware.smack.filter package包中有许多预定义的过滤器。
packetListener 是一个能够处理随时可能到了的packet监听器, packetFilter能够判断packet是否由该packetListener处理
是的话则调用processPacket()方法处理packet. 至此整个过程处理完成
发表评论
-
判断Android系统时间是否是24小时制
2012-05-07 12:04 6329次方法判断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 6354在线下载更新Android SDK时会提示:Site Aut ... -
使用AXMLPrinter2.jar批量反编译xml文件
2012-02-25 23:56 9202使用AXMLPrinter2.jar批量反编译xml文件. ... -
eclipse导入的Android项目没有android.jar包并报错
2012-02-15 11:35 9198从网上下载一个项目, 报错. 发现没有导入android.j ... -
[转载]Android UI 的更新及其线程模型
2012-02-06 11:00 1493让我们通过一个交通状 ... -
smack 源码分析- PacketWriter (android上实现长连接)
2012-01-11 16:36 3155上一篇smack 源码分析一(android上实现长连接) ... -
smack 源码分析一(android上实现长连接)
2012-01-11 15:35 8092前段时间应一个项目需求: 要求给终端短信, 联系人信息做一个 ... -
smack 源码分析一
2012-01-11 14:44 2前段时间应一个项目需求: 要求给终端短信, 联系人信息做一个 ... -
解决SipDroid导入Eclipse报错问题
2012-01-10 11:16 20281. 准备工具: SVN , ANT 2. 操作步骤: ... -
android sqlite查询数据时报错: get field slot from row 0 col -1 failed
2011-12-14 15:02 5130android sqlite查询数据时报错: get f ... -
Android开发笔记-签名认证
2011-10-08 12:32 1670一个android项目开发完成之后要安装到设备上或者放到电子市 ... -
Android开发笔记-EditText自动补全功能
2011-09-08 18:04 15476项目开发之需要, 根据用户拼音或代码检索出用户信息. 现在有 ... -
android开发笔记-sqllite数据库的操作
2011-09-08 17:01 34211.SQLLite简介: 在Android平 ... -
android开发笔记-ListView动态加载数据
2011-08-06 12:31 6995项目开发之需要, 做一个ListView分页显示, 动态加载数 ... -
android开发笔记-Handler的理解
2011-07-25 16:35 8741.Handler的定义: 在主线程中创建, 用于接收子 ... -
android开发笔记-Handler的理解
2011-07-25 16:32 9561.Handler的定义: 在主线程中创建, 用于接收子 ... -
Android常见组件属性详解
2011-07-20 16:07 6471. TextView 属性详解: http://www.cm ... -
Android常见错误代码
2011-07-20 15:50 12531.Installation error: INSTALL_F ... -
基于Google Map API的android地图开发
2011-05-23 22:37 29851. 因为Google Map 类库不是android sdk ...
相关推荐
implementation 'org.igniterealtime.smack:smack-android-extensions:4.3.5' implementation 'org.igniterealtime.smack:smack-tcp:4.3.5' implementation 'org.igniterealtime.smack:smack-im:4.3.5' ...
综上所述,"smack-resolver-dnsjava-4.0.0-rc2.zip" 包含了 Smack 的一个版本,它利用 DNSJava 实现了对 XMPP 服务器的智能解析。同时,描述中的 Peon 可能是一个辅助 XMPP 服务器管理的工具,同样使用 Java 编写。...
标题中的"smack-resolver-javax-4.1.0-alpha6.zip"是一个软件库的压缩包,Smack是一款开源的XMPP客户端库,而"javax"可能指的是它提供了与Java平台兼容的解析器组件。这个版本是4.1.0的Alpha6,意味着它是一个开发...
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
smack4.1.0的依赖包minidns.jar。可用于smack4.1.3,亲测可用!
本压缩包"smack-core-4.0.0.zip"包含了Smack Core 4.0.0版本的源代码,这是一个著名的Java即时通讯(Instant Messaging)库,主要用于实现XMPP协议。Smack为开发者提供了丰富的API,使得构建XMPP应用变得更加便捷。 ...
**Android Smack源码解析** ...总之,Android Smack源码是一个深入了解XMPP协议和即时通讯实现的宝贵资源,对于需要构建IM应用的开发者来说,深入研究这个库将大大提升他们的专业技能和解决问题的能力。
总之,Smack-JAR是Android开发者构建即时通讯应用的强大工具,通过理解和熟练运用其API,可以实现丰富的通讯功能,如一对一聊天、群聊、文件传输等。同时,还需要关注Android平台的特性,确保应用的稳定性和用户体验...
总结,Smack 4.3.1是一个强大的Android即时通讯框架,它为开发者提供了实现XMPP协议所需的全部工具,通过合理的使用和配置,可以构建出高效、稳定的IM应用。结合Openfire等服务器,可以构建出企业级的通讯解决方案。
implementation 'org.igniterealtime.smack:smack-android-extensions:4.4.3' implementation 'org.igniterealtime.smack:smack-tcp:4.4.3' implementation 'org.igniterealtime.smack:smack-im:4.4.3' ...
自4.1.0版本起,Smack开始全面支持Android平台,使得开发者能够方便地在Android设备上构建功能丰富的聊天应用程序。在"android_smack4.1.9-demo"项目中,我们能看到如何在Android Studio环境下集成并使用Smack 4.1.9...
这个"smack-1.0-master"压缩包包含的是Smack工具的源代码,主要版本为1.0,并且经过了特定的修改,能够支持`.smackcipso`、`smackload`、`smackaccess`和`smackctl`等工具的使用。下面将详细介绍这些工具和Smack系统...
【标题】"smack-extensions-4.1.0-alpha3.zip" 提供的是 Smack 开源库的一个扩展包,版本为4.1.0的Alpha3版本。Smack 是一个用于XMPP(Extensible Messaging and Presence Protocol)的Java库,它允许开发者在Java...
implementation 'org.igniterealtime.smack:smack-android-extensions:4.3.5' implementation 'org.igniterealtime.smack:smack-tcp:4.3.5' implementation 'org.igniterealtime.smack:smack-extensions:4.3.5' }...
通过分析和学习Smack源码,不仅可以掌握XMPP协议的实现细节,还能提升对Java网络编程、XML处理、事件驱动编程的理解,为开发实时通信应用打下坚实基础。同时,这也有助于理解其他基于XMPP的项目,如ejabberd服务器或...
【标题】"smack-im-4.3.4-sources_www.im.43_im_" 指的是 Smack IM 的4.3.4版本的源代码,这个开源项目主要关注即时通讯(IM)功能的实现。Smack是一个用Java编写的库,允许开发者在他们的应用程序中集成XMPP...
asmack-android-16-beem.jar是一个编译后的Java类库,而这里的源码提供了一窥其实现细节的机会,对于开发者来说,这有助于理解Beem如何利用Asmack在Android平台上实现其功能。 标签“asmack”,“android 16”,...