最近要做一个机器人登陆,并维护登陆状态,实现机器人给客户端发送消息。特查阅网上资料和结合自己的理解写下这篇文章,不当之处,还请指正。
我思路是:利用smack包实现机器人登陆和发送消息。smack默认会维护长连接
(一)建立连接
smack的关键有以下这几个类: Connection , XMPPConnection , PakcetWriter , PacketReader. 连接建立过程
1.1总体思路
1. initReaderAndWriter()方法通过上面创建的socket实例化connection
的Writer和Reader.
2. 实例化PacketWriter和PacketReader对象.
PacketWriter就是向服务器发送数据发送心跳包一直保持与服务器的连接连. PacketReader则是不断的读取并且解析服务器推送的消息.
3. 分别调用packetWriter和packetReader的startup()方法.
至此整个连接过程就建立完成了.
(二)读过程
2.1总体思路
1.使用socket连接服务器
2.将XmlPullParser的数据源关联到socket的InputStream
3.启动线程不断循环处理消息
4.将接收到的消息解析xml处理封装好成一个Packet包
5.将包广播给所有注册事件监听的类
2.2消息是如何接收和处理?
创建PacketReader类时就初始化线程readerThread和ExecutorService ,接着调用resetParser() 方法为parser设置输入源(这里是重点,parser的数据都是通过这里获取),调用startup启动线程,循环监听parser,如果接收到消息根据消息协议的不同将调用PacketParserUtils类里的不同方法,这里调用parseMessage()该方法主要处理message的消息,在该方法里分析message消息并返回packet包。返回的包将调用processPacket方法,先通知所有注册了PacketCollector的监听
2.3消息是如何通知事件的?
消息(listenerExecutor.submit(new ListenerNotification(packet)); )传递给所有注册了PacketListener的监听。
(三)写过程
3.1总体思路
1.使用socket连接服务器
2.启动线程writerThread不断循环处理消息
3.将待发送的Packet放到queue里面
4.将包广播给监听器,writerThread从queue读取包,并发送
3.2终端如何发送消息到服务器呢?
在PacketWriter构造方法中传递参数XMPPConnection作为PacketWriter成员变量, 然后调用init()方法 ,而在init()方法中, 开辟一个线程专门用于向服务器写数据. writerPackets()里面是一个无限循环体, 不断的从消息队列queue读取pakcet消息读取完之后调用wirter.flush()方法, 将消息发送的服务器. 这个过程就完成了终端完服务器发送消息的过程.
3.3终端如何与服务器一直保持联系?
心跳发送类: KeepAliveTask 是一个自定义线程, 它定义了心跳发送的时间间隔, 在其run方法里面一个无限循环体每隔delay毫秒就向云端发发送一个空消息(当然, 如需要你可以根据项目需求自定义一个心跳包). 整个PacketWriter介绍基本到此结束, 在你应用登陆成功之后就可以开启KeepAliveTask 线程定时发送心跳包到服务器保持终端与服务器的长连接.