转自:
http://blog.csdn.net/wqhjfree/article/details/7194416
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 线程定时发送心跳包到服务器保持终端与服务器的长连接.
分享到:
相关推荐
【标题】"smack-resolver-dnsjava-4.0.0-rc2.zip" 提供的是 Smack 开源库的一个版本,其中包含了 DNSJava 的解析器模块。Smack 是一个用于 XMPP(Extensible Messaging and Presence Protocol)的 Java 库,它允许...
标题中的"smack-resolver-javax-4.1.0-alpha6.zip"是一个软件库的压缩包,Smack是一款开源的XMPP客户端库,而"javax"可能指的是它提供了与Java平台兼容的解析器组件。这个版本是4.1.0的Alpha6,意味着它是一个开发...
总之,Smack-3.4.1 是一个强大的XMPP客户端库,为Java开发者提供了全面的工具来构建即时通讯应用,其丰富的功能和良好的社区支持使其成为开发此类应用的首选之一。通过理解和使用Smack,开发者可以轻松地实现即时...
本压缩包"smack-core-4.0.0.zip"包含了Smack Core 4.0.0版本的源代码,这是一个著名的Java即时通讯(Instant Messaging)库,主要用于实现XMPP协议。Smack为开发者提供了丰富的API,使得构建XMPP应用变得更加便捷。 ...
smack4.1.0的依赖包minidns.jar。可用于smack4.1.3,亲测可用!
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-JAR在Android中的应用** Smack是一款开源的XMPP(Extensible Messaging and Presence Protocol)客户端库,用于创建即时通讯应用。它提供了一套完整的API,使得开发者能够轻松地构建XMPP服务器和客户端之间...
"smack-jar包"正是这个库的归档文件,包含了所有必要的类和资源,供开发者在自己的项目中使用。 首先,我们需要了解什么是jar包。Java Archive (JAR) 文件是一种特殊类型的归档文件,它包含了一组Java类文件以及...
这个"smack-1.0-master"压缩包包含的是Smack工具的源代码,主要版本为1.0,并且经过了特定的修改,能够支持`.smackcipso`、`smackload`、`smackaccess`和`smackctl`等工具的使用。下面将详细介绍这些工具和Smack系统...
org.jivesoftware.smack-3.2.2.jar
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-4.2.1库来实现在Android上使用XMPP进行各种交互,如登录、注册、发送单聊消息、加入聊天室和发送群聊消息等基本功能。 首先,我们需要了解Smack-4.2.1。Smack是一个开源的Java库,专门...
标题中的“samck 电子文档 smack-1.5.0.jar smackx-1.5.0”提及了两个关键组件,即Smack和SmackX,它们是Java库,主要用于处理XMPP(Extensible Messaging and Presence Protocol)协议。XMPP是一种开放标准,用于...
【标题】"smack-extensions-4.1.0-alpha3.zip" 提供的是 Smack 开源库的一个扩展包,版本为4.1.0的Alpha3版本。Smack 是一个用于XMPP(Extensible Messaging and Presence Protocol)的Java库,它允许开发者在Java...
【标题】"smack-im-4.3.4-sources_www.im.43_im_" 指的是 Smack IM 的4.3.4版本的源代码,这个开源项目主要关注即时通讯(IM)功能的实现。Smack是一个用Java编写的库,允许开发者在他们的应用程序中集成XMPP...
- smack-xmpp-client-core.jar:Smack的核心组件,包含了基础的XMPP客户端功能。 正确地将这些jar包添加到项目的类路径中,你的Java应用就能利用Smack库的强大功能进行XMPP通信。在开发过程中,务必参考Smack的官方...
1. `smack-java7-4.1.6.jar`:这是Smack的主要库,针对Java 7进行了优化,包含了实现XMPP协议的核心功能。 2. `httpclient-cache-4.5.2.jar`:Apache HttpClient库的一个版本,用于处理HTTP请求,可能在Smack中用于...