androidPN服务端用的是mina,略去不表,客户端的socket通讯用的是asmack,期间使用xmpp协议通讯,这个xmpp通用是通用了,但用的是xml格式互发,之间不得不加了一堆的xml解析,大部分篇幅都是干这个,对此没多大兴趣,这里只是简单记录一下阅读源码中client与server的阻塞读写,寻找可以借鉴之处。
客户端启动之后,负责管理连接的XMPPConnection初始化:
if (isFirstInitialization) { packetWriter = new PacketWriter(this); packetReader = new PacketReader(this);
分别负责读写。然后启动二者:
// 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;
先来看packetWriter是如何向服务器发送数据的,它的初始化方法
protected void init() { this.writer = connection.writer; done = false; writerThread = new Thread() { public void run() { writePackets(this); } }; writerThread.setName("Smack Packet Writer (" + connection.connectionCounterValue + ")"); writerThread.setDaemon(true); }
开一个守候线程writeThread,跑writePackets(this),该方法主要代码:
// Write out packets from the queue. while (!done && (writerThread == thisThread)) { Packet packet = nextPacket(); if (packet != null) { writer.write(packet.toXML()); if (queue.isEmpty()) { writer.flush(); } } }
其中queue,线程安全:
private final BlockingQueue<Packet> queue;
queue中有数据就write到服务器,如果没数据,阻塞在nextPacket():
private Packet nextPacket() { Packet packet = null; // Wait until there's a packet or we're done. while (!done && (packet = queue.poll()) == null) { try { synchronized (queue) { queue.wait(); } } catch (InterruptedException ie) { // Do nothing } } return packet; }
看看,queue.wait(),写线程阻塞于此,省电! 既然有wait(),必然有notifyAll():
public void sendPacket(Packet packet) { if (!done) { // Invoke interceptors for the new packet that is about to be sent. Interceptors // may modify the content of the packet. connection.firePacketInterceptors(packet); try { queue.put(packet); } catch (InterruptedException ie) { ie.printStackTrace(); return; } synchronized (queue) { queue.notifyAll(); } // Process packet writer listeners. Note that we're using the sending // thread so it's expected that listeners are fast. connection.firePacketSendingListeners(packet); } }
当其他线程把要写的数据put进queue时,writerThread即被唤醒,继续运作,标准的生产消费模式。这个过程还是比较简单的,一目了然,相比之下PacketReader就不那么省心。
PacketReader初始化:
protected void init() { //... readerThread = new Thread() { public void run() { parsePackets(this); } }; //... resetParser(); }接着看parsePackets:
private void parsePackets(Thread thread) { try { int eventType = parser.getEventType(); do { if (eventType == XmlPullParser.START_TAG) { //... //...很长很长,都在xml纠结 //... eventType = parser.next(); } while (!done && eventType != XmlPullParser.END_DOCUMENT && thread == readerThread); }
相关推荐
1. **注册过程**:客户端需要先注册到AndroidPN服务端,通常会提供一个唯一的设备标识(如IMEI或Android ID)以及应用程序的唯一标识(APP ID)。注册成功后,服务端将返回一个注册令牌,用于后续的消息推送。 2. *...
AndroidPN客户端代码是实现这一功能的关键部分,它处理与服务器的连接、消息接收和显示等任务。下面我们将深入探讨AndroidPN客户端的相关知识点。 1. **推送通知原理**: AndroidPN基于XMPP(Extensible Messaging...
Androidpn客户端 和服务端源码下载,实现了消息推送。具体使用方法可百度。
"AndroidPN 客户端和服务端"是一个完整的推送通知服务解决方案,主要针对Android平台。这个项目包括了客户端应用程序和服务器端的实现,旨在提供实时、可靠的信息推送功能,使得应用程序能够在用户不主动打开应用的...
接下来是客户端部分,`androidpn-client-0.5.0`包含了客户端的源代码。客户端的职责包括: 1. **注册**:客户端在启动时会连接到服务端,并注册其设备以便接收通知。这通常涉及到获取GCM或FCM的注册ID并将其发送到...
1. **AndroidPn服务端**:服务端是整个通信架构的核心,它可能基于Java或其他后端技术(如Node.js或Python)构建,部署在云服务器或本地服务器上。服务端的主要职责包括: - **连接管理**:接受并验证来自客户端的...
1. **API集成**:客户端需要集成AndroidPN的SDK,并进行必要的初始化设置,如获取GCM或FCM的注册ID并发送给服务端。 2. **安全**:在处理推送消息时,确保数据传输的安全性,例如使用HTTPS进行通信,防止中间人攻击...
AndroidPN(Android Push Notification)是一种基于XMPP(Extensible Messaging and Presence Protocol)协议的开源消息推送客户端,主要用于Android平台。XMPP是一种开放标准的即时通讯协议,它允许应用程序通过...
1. **集成SDK**:开发者需要将AndroidPN客户端库集成到自己的应用中,设置相应的配置。 2. **接口实现**:自定义接口处理服务器推送的事件,如点击通知后的回调。 3. **错误处理**:添加适当的异常处理代码,确保在...
1. 节能高效:AndroidPN客户端采用长连接模式,减少了网络资源的消耗,降低了消息延迟,同时减少了对电池的损耗。 2. 可扩展性:基于XMPP协议,AndroidPN客户端支持自定义扩展,可以适应各种复杂的应用场景。 3. ...
这个"基于androidpn设计的android客户端远程推送demo"应该包含以下部分: 1. **源代码**:Android应用的源代码,可能包括Activity、BroadcastReceiver、Service等关键组件。 2. **配置文件**:如GoogleService....
androidpn 的客户端和服务器端源码. 使用说明: 解压后得到两个压缩包: androidpn-client.zip和androidpn-server-0.5.0-bin.zip, 解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties...
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件...
《AndroidPN客户端0.5.0:XMPP技术在手机消息推送中的应用》 AndroidPN客户端0.5.0是一款专为Android平台设计的消息推送服务,它基于XMPP(Extensible Messaging and Presence Protocol)协议,提供了开源的客户端...
"AndroidPN-client-0.5.0.zip" 是一个针对Android平台的Push Notification服务客户端的压缩包文件。Push Notification(简称PN)是一种允许服务器向移动设备推送消息的技术,无需应用程序处于活动状态。在这个版本...
AndroidPN客户端是安装在用户Android设备上的应用程序,它的主要任务是接收来自服务器端的消息并将其展示给用户。客户端通过注册一个唯一的设备ID到服务器,然后保持与服务器的持久连接,以便随时接收推送通知。这种...
本资源包提供了AndroidPN服务端和客户端的源码,以及相关的部署说明,便于开发者快速理解和实现推送通知功能。 一、AndroidPN服务端 AndroidPN服务端是基于Java语言开发的,它使用了Spring框架和Hibernate ORM来...
androidpn基于Xmpp的消息推送源码包含了完整的客户端和服务器端。androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,...
**AndroidPN客户端0.5推送源码解析** AndroidPN(Android Push Notification)是一个开源项目,旨在为Android设备提供一个高效、可靠的消息推送服务。在移动应用开发中,消息推送是提高用户互动性和实时性的重要...