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); }
相关推荐
为了测试androidpn 的服务端 写的模拟androidpn客户端的代码
Androidpn客户端 和服务端源码下载,实现了消息推送。具体使用方法可百度。
AndroidPN实现了从服务器到android移动平台的文本消息推送
androidpn客户端和服务端,测试可用,服务端用mysql数据库存储数据,修改数据库配置文件/Androidpn/resources目录下的jdbc.properties即可
androidpn服务端与客户端代码,自己测试过,真机可以,但是模拟器却不行
AndroidPn框架的服务器和客户端;
完整版的androidpn,包含客户端和服务端,运行即可看到结果,需要更完善的客户端可以联系我,包括断线重连的功能。
基于androidPN的android客户端远程推送,可直接运行,附运行说明
androidpn 的客户端和服务器端源码. 使用说明: 解压后得到两个压缩包: androidpn-client.zip和androidpn-server-0.5.0-bin.zip, 解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties...
韩国著名的开源消息推送AndroidPN客户端,采用XMPP协议。
androidpn-client推送客户端
androidpn基于Xmpp的消息推送源码包含了完整的客户端和服务器端。androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,...
androidpn 消息推送客户端+服务器端
androidpn客户端文件,以及安装说明
这个是从androidpn客户端中整理出来的登录连接和接收推送的DEMO.
本资源包包含androidpn服务端,客户端代码及说明,直接部署到tomcat可以直接使用
可以运行的androidpn服务器代码和客户端代码,服务器代码直接解压然后找到bin目录下面的run.bat文件双击运行即可,客户端的代码直接导入eclipse,改下raw/androidpn.properties里面的: apiKey=1234567890 xmppHost...
androidpn的tomcat版本,下载后你需要配置mysql数据库,并且要更改resource文件夹里面的相关内容~可以参考网上各种文档,androidpn的客户端可以直接圆形,但是ip地址和host端口可能需要调整~代码无任何问题,关键看...
解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties文件,配置客户端程序。 1. 如果是模拟器来运行客户端程序,把xmppHost配置成10.0.2.2[模拟器把10.0.2.2认为是所在主机的地址,...