androidPN初步了解

XMPP协议是基于xml格式的通讯协议,一般常用于即时通讯软件

androidPN的客户端用到了asmack.jar

smack.jar中的几个类:

Packet:XMPP协议中的包,服务端和客户端进行消息传递的载体,IQ、Message继承自他
PacketReader(接收消息) 会启动一个线程,循环读取服务端发过来的消息,当接收到服务端的信息后,对其进行pull解析
 
 
  1.   在XMPPConnection建立链接的时候会生成一个PacketReader和PacketWriter,并将其启动,XMPPConnection如代码如下:

  2. try {

  3.           if (isFirstInitialization) {

  4. packetWriter = new PacketWriter(this);

  5. packetReader = new PacketReader(this);

  6.               if (config.isDebuggerEnabled()) {

  7.                   addPacketListener(debugger.getReaderListener(), null);

  8.                   if (debugger.getWriterListener() != null) {

  9.                       addPacketSendingListener(debugger.getWriterListener(), null);

  10.                   }

  11.               }

  12.           }

  13.           else {

  14. packetWriter.init();

  15. packetReader.init();

  16.           }

  17. // Start the packet writer. This will open a XMPP stream to the server

  18. packetWriter.startup();

  19.           // Start the packet reader. The startup() method will block until we

  20.           // get an opening stream packet back from server.

  21. packetReader.startup();

PacketWriter 向服务端发送消息
在PacketWriter中开启一个守护线程,
 
 
  1. 保持长连接的线程是一个守护线程,启动是在XMPPConnection类的init( )方法中

  2. packetWriter.startKeepAliveProcess();

这个线程的主要作用就保持长连接,实现方法就是每隔30S,向服务端发送空字节
 
 
  1. while (!done && keepAliveThread == thread) {

  2.                synchronized (writer) {

  3.                    // Send heartbeat if no packet has been sent to the server for a given time

  4.                    if (System.currentTimeMillis() - lastActive >= delay) {

  5.                        try {

  6.   //发空心跳包的地方

  7. writer.write(" ");

  8.                            writer.flush();

  9.                        }

  10.                        catch (Exception e) {

  11.                            // Do nothing

  12.                        }

  13.                    }

  14.                }

  15.                try {

  16.                    // Sleep until we should write the next keep-alive.

  17.                    Thread.sleep(delay);

  18. //这个地方的时间间隔是多少?

  19. // 30S

为什么要维护长连接?客户端注册登录成功后,服务器端会维护一个列表,表中记录着当前在线客户端相关信息.长连接维护了TCP链接,
服务端可以向当前的在线的客户端直接发送相关信息,保证信息的及时性。

你可能感兴趣的:(androidPN初识,smack了解)