xmpp协议的使用.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《xmpp协议的使用.doc》由会员分享,可在线阅读,更多相关《xmpp协议的使用.doc(46页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、在android里面用的smack包其实叫做asmack,该包提供了两种不同的连接方式:socket和httpclient。该并且提供了很多操作xmpp协议的API,也方便各种不同自定义协议的扩展。我们不需要自己重新去定义一套接收机制来扩展新的协议,只需继承然后在类里处理自己的协议就可以了。而本文今天主要说两点,一点就是消息是如何接收的,另一点就是消息是如何通知事件的。 总的思路1.使用socket连接服务器2.将XmlPullParser的数据源关联到socket的InputStream3.启动线程不断循环处理消息4.将接收到的消息解析xml处理封装好成一个Packet包5.将包广播给所有注
2、册事件监听的类 逐步击破(声明在看下面的文章时,最好先理解一下smack的使用,这样才能达到深入的理解)(谨记:上图只显示本文章解释所要用到的类和方法,减缩了一些跟本文主题无关的代码,只留一条贯穿着从建立连接到接收消息的线。)解析这块东西打算从最初的调用开始作为入口,抽丝剥茧,逐步揭开。1.PacketListener packetListener = new PacketListener() Override public void processPacket(Packet packet) System.out .println(Activity-processPacket+ packet.
3、toXML(); ; PacketFilter packetFilter = new PacketFilter() Override public booleanaccept(Packet packet) System.out.println(Activity-accept+ packet.toXML(); return true; ; 解释:创建包的监听以及包的过滤,当有消息到时就会广播到所有注册的监听,当然前提是要通过packetFilter的过滤。2.connection = new XMPPConnection();XMPPConnection在这构造函数里面主要配置ip地址和端口(s
4、uper(new ConnectionConfiguration(169.254.141.109, 9991);)3.connection.addPacketListener(packetListener, packetFilter);connection.connect();注册监听,开始初始化连接。4.public voidconnect() / Stablishes the connection, readers and writers connectUsingConfiguration(config);5.private void connectUsingConfiguration(C
5、onnectionConfiguration config) String host = config.getHost(); intport = config.getPort(); try this.socket= newSocket(host, port); catch(UnknownHostException e) e.printStackTrace(); catch(IOException e) e.printStackTrace(); initConnection(); 通过之前设置的ip和端口,建立socket对象6.protected void initDebugger() Cla
6、ss debuggerClass = null; try debuggerClass = Class.forName(com.simualteSmack.ConsoleDebugger); Constructor constructor = debuggerClass.getConstructor( Connection.class, Writer.class, Reader.class); debugger= (SmackDebugger) constructor.newInstance(this, writer, reader); reader= debugger.getReader();
7、 catch(ClassNotFoundException e1) /TODOAuto-generated catch block e1.printStackTrace(); catch(Exception e) throw newIllegalArgumentException( Cant initialize the configured debugger!, e); private void initReaderAndWriter() try reader = newBufferedReader(newInputStreamReader(socket .getInputStream(),
8、 UTF-8); catch(UnsupportedEncodingException e) /TODOAuto-generated catch block e.printStackTrace(); catch(IOException e) /TODOAuto-generated catch block e.printStackTrace(); initDebugger();private void initConnection() / Set the reader and writer instance variables initReaderAndWriter(); packetReade
9、r = new PacketReader(this); addPacketListener(debugger.getReaderListener(), null); / Start the packet reader. The startup() method will block until we / get an opening stream packet back from server. packetReader.startup();从三个方法可以看出,建立reader和writer的对象关联到socket的InputStream,实例化ConsoleDebugger,该类主要是打印出
10、接收到的消息,给reader设置了一个消息的监听。接着建立PacketReader对象,并启动。PacketReader主要负责消息的处理和通知7.public class PacketReader Private ExecutorService listenerExecutor; private boolean done; Private XMPPConnection connection; Private XmlPullParser parser; Private Thread readerThread; Protected PacketReader(finalXMPPConnection
11、 connection) this.connection= connection; this.init(); /* * Initializes the reader in order to be used. The reader is initialized * during the first connection and when reconnecting due to an abruptly * disconnection. */ protected void init() done= false; readerThread= newThread() public voidrun() p
12、arsePackets(this); ; readerThread.setName(Smack Packet Reader ); readerThread.setDaemon(true); / create an executor to deliver incoming packets to listeners. / we will use a single thread with an unbounded queue. listenerExecutor= Executors .newSingleThreadExecutor(newThreadFactory() Override public
13、Thread newThread(Runnable r) Thread thread = newThread(r, smack listener processor); thread.setDaemon(true); returnthread; ); resetParser(); /* * Starts the packet reader thread and returns once a connection to the * server has been established. A connection will be attempted for a maximum * of five
14、 seconds. An XMPPException will be thrown if the connection fails. * */ public voidstartup() readerThread.start(); /* * Shuts the packet reader down. */ public voidshutdown() done= true; / Shut down the listener executor. listenerExecutor.shutdown(); private voidresetParser() try parser= XmlPullPars
15、erFactory.newInstance().newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(connection.reader); catch(XmlPullParserException xppe) xppe.printStackTrace(); /* * Parse top-level packets in order to process them further. * *paramthread * the thread that i
16、s being used by the reader to parse incoming * packets. */ private void parsePackets(Thread thread) try Int eventType = parser.getEventType(); do if(eventType = XmlPullParser.START_TAG) if(parser.getName().equals(message) processPacket(PacketParserUtils.parseMessage(parser); System.out.println(START
17、_TAG); else if(eventType = XmlPullParser.END_TAG) System.out.println(END_TAG); eventType = parser.next(); while(!done& eventType != XmlPullParser.END_DOCUMENT & thread = readerThread); catch(Exception e) e.printStackTrace(); if(!done) private void processPacket(Packet packet) if(packet = null) retur
18、n; / Loop through all collectors and notify the appropriate ones. for(PacketCollector collector : connection.getPacketCollectors() collector.processPacket(packet); / Deliver the incoming packet to listeners. listenerExecutor.submit(newListenerNotification(packet); /* * A runnable to notify all liste
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- xmpp 协议 使用
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内