Android studio使用smack连接xmpp服务器收发消息

我使用的是ejabberd16.09的Linux版本,安装教程网上有很多,我在这里只介绍一下Android端连接、登录和收发消息的方法。文章最后附上了我写的一个demo,欢迎大家参考。

ejabberd官网地址:点击打开链接

    进入正题,我使用的是smack4.1.2包,需要在android studio的build.gradle文件中加入

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. compile ("org.igniterealtime.smack:smack-android-extensions:4.1.2") {  
  2.     exclude group: 'xpp3', module: 'xpp3'  
  3. }  
  4. compile ("org.igniterealtime.smack:smack-android:4.1.2") {  
  5.     exclude group: 'xpp3', module: 'xpp3'  
  6. }  
  7. // Optional for XMPPTCPConnection  
  8. compile ("org.igniterealtime.smack:smack-tcp:4.1.2") {  
  9.     exclude group: 'xpp3', module: 'xpp3'  
  10. }  
  11. // Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)  
  12. compile ("org.igniterealtime.smack:smack-im:4.1.2") {  
  13.     exclude group: 'xpp3', module: 'xpp3'  
  14. }  


点击 "Sync Project with Gradle Files"按钮即可将smack4.1.2引入项目中

下面介绍连接和登录的方法,并带有监听收到消息的方法

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1.      private XMPPTCPConnection con;  
  2.      private Runnable XmppThread = new Runnable(){  
  3. <span style="white-space:pre">    </span>@Override  
  4.         public void run() {  
  5.             boolean tag = false;  
  6.             XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();  
  7.             config.setHost("192.168.26.38");              //设置ejabberd主机IP  
  8.             config.setServiceName("h.com");         //设置ejabberd服务器名称  
  9.             config.setPort(5222);                   //设置端口号:默认5222  
  10.             config.setUsernameAndPassword("admin", "111111");    //设置用户名与密码  
  11.             config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);      //禁用SSL连接  
  12.             config.setSendPresence(true);  
  13.             config.setDebuggerEnabled(true);  
  14.             con = new XMPPTCPConnection(config.build());  
  15.             try {  
  16.                 con.connect();  
  17.                 tag = con.isConnected();  
  18.                 Roster roster = Roster.getInstanceFor(con);  
  19.                 try {  
  20.                     con.login();  
  21.                     Log.e("TAG", "login sucess!!");  
  22.                 } catch (Exception e) {  
  23.                     e.printStackTrace();  
  24.                 }  
  25.                 //         设置聊天监听器,监听聊天消息  
  26.                 ChatManager chatm = ChatManager.getInstanceFor(con);  
  27.                 chatm.addChatListener(new ChatManagerListener() {  
  28.                     @Override  
  29.                     public void chatCreated(Chat chat, boolean b) {  
  30.                         if (!b) {           //不是本地创建的会话  
  31.                             chat.addMessageListener(new ChatMessageListener() {  
  32.                                 @Override  
  33.                                 public void processMessage(Chat chat, Message message) {  
  34.                                     Log.d("PushTest", message.toString());  
  35.                                     Log.d("PushTest", message.getType().toString());  
  36.                                     Log.d("PushTest", message.getExtension("extension").toString());  
  37.                                     Log.d("PushTest", message.getExtension("extension").getNamespace());  
  38.                                     Log.d("PushTest", message.getExtension("extension").getElementName());  
  39.                                     DefaultExtensionElement defaultExtensionElement = message.getExtension(  
  40.                                             ELEMENT_NAME,NAME_SPACE);  
  41.                                     String name = defaultExtensionElement.getValue("name");  
  42.                                     String url = defaultExtensionElement.getValue("url");  
  43.                                     Log.d("PushTest", name);  
  44.                                     Log.d("PushTest", url);  
  45.                                 }  
  46.                             });  
  47.                         }  
  48.                     }  
  49.                 });  
  50.   
  51.             } catch (Exception e) {  
  52.                 Log.e("TAG", "connect failed!" + e.toString());  
  53.                 e.printStackTrace();  
  54.   
  55.             }  
  56.             if(tag){  
  57.                 handler.sendEmptyMessage(0x00);  
  58.             }else{  
  59.                 handler.sendEmptyMessage(0x01);  
  60.             }  
  61.         }  
  62.     };  



其中的

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. DefaultExtensionElement defaultExtensionElement = message.getExtension(  
  2.         ELEMENT_NAME,NAME_SPACE);  
  3. String name = defaultExtensionElement.getValue("name");  
  4. String url = defaultExtensionElement.getValue("url");  


是我在服务端发送消息时加的Message的属性拓展,定义如下:

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. import org.jivesoftware.smack.packet.ExtensionElement;  
  2.   
  3. public class Received implements ExtensionElement  {  
  4. {  
  5.       
  6.     private static final String NAME_SPACE = "extension";  
  7.     private static final String ELEMENT_NAME = "userinfo";  
  8.       
  9.     //用户姓名元素名称  
  10.     private String nameElement = "name";  
  11.     //用户姓名元素文本(对外开放)  
  12.     private String nameText = "";  
  13.   
  14.     //用户地址元素名称  
  15.     private String urlElement = "url";      
  16.     //用户地址元素文本(对外开放)  
  17.     private String urlText = "";  
  18.   
  19.     @Override  
  20.     public String getElementName() {  
  21.         return ELEMENT_NAME;  
  22.     }  
  23.   
  24.     @Override  
  25.     public String getNamespace() {  
  26.         return NAME_SPACE;  
  27.     }  
  28.   
  29.     @Override  
  30.     public CharSequence toXML() {  
  31.         StringBuilder sb = new StringBuilder();  
  32.   
  33.         sb.append("<").append(ELEMENT_NAME).append(" xmlns="").append(NAME_SPACE).append("">");  
  34.         sb.append("<" + nameElement + ">").append(nameText).append("</"+nameElement+">");  
  35.         sb.append("<" + urlElement + ">").append(urlText).append("</"+urlElement+">");  
  36.         sb.append("</"+ELEMENT_NAME+">");  
  37.   
  38.         return sb.toString();  
  39.     }  
  40.   
  41.     public String getNameText() {  
  42.         return nameText;  
  43.     }  
  44.   
  45.     public void setNameText(String nameText) {  
  46.         this.nameText = nameText;  
  47.     }  
  48.   
  49.     public String getUrlText() {  
  50.         return urlText;  
  51.     }  
  52.   
  53.     public void setUrlText(String urlText) {  
  54.         this.urlText = urlText;  
  55.     }  
  56. }  

使用时的方法如下:

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1.         ChatManager chatm = ChatManager.getInstanceFor(mXmppConnection);  
  2.         Chat chat = chatm.createChat("ly@h.com", new ChatMessageListener() {        //创建与ly的会话  
  3.             public void processMessage(Chat chat, Message message) {  
  4.                 System.out.println("Received message: " + message);  
  5.             }  
  6.             });  
  7.         try {  
  8.             /** 
  9.              * 发送一条消息给ly 
  10.              */  
  11.             Received received = new Received();  
  12.             received.setNameText(name);  
  13.                 Message message = new Message();  
  14.                 message.setBody(context);  
  15.                 message.setTo("ly@h.com");  
  16.                 message.setFrom("gqw@h.com");  
  17.                 message.addExtension(received);  
  18.                 chat.sendMessage(message);  
  19.   
  20.         } catch (SmackException.NotConnectedException e) {  
  21.             e.printStackTrace();  
  22.         }  

 

原文地址:https://www.cnblogs.com/yzycoder/p/6103469.html