zoukankan      html  css  js  c++  java
  • 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.         }  

     

  • 相关阅读:
    Java技术之ThreadLocal的使用
    find and find_by
    vim-config
    把字符串当做js代码执行的方法
    lodop打印设计
    前端使用lodop如何获取打印状态
    lodop第三方插件的使用
    nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍
    nodejs 用http模块搭建的服务器的路由,以及路由代码的重构过程
    nodejs基础 用http模块 搭建一个简单的web服务器 响应JSON、html
  • 原文地址:https://www.cnblogs.com/yzycoder/p/6103469.html
Copyright © 2011-2022 走看看