Android studio使用smack连接xmpp服务器收发消息
我使用的是ejabberd16.09的Linux版本,安装教程网上有很多,我在这里只介绍一下Android端连接、登录和收发消息的方法。文章最后附上了我写的一个demo,欢迎大家参考。
ejabberd官网地址:点击打开链接
进入正题,我使用的是smack4.1.2包,需要在android studio的build.gradle文件中加入
- compile ("org.igniterealtime.smack:smack-android-extensions:4.1.2") {
- exclude group: 'xpp3', module: 'xpp3'
- }
- compile ("org.igniterealtime.smack:smack-android:4.1.2") {
- exclude group: 'xpp3', module: 'xpp3'
- }
- // Optional for XMPPTCPConnection
- compile ("org.igniterealtime.smack:smack-tcp:4.1.2") {
- exclude group: 'xpp3', module: 'xpp3'
- }
- // Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)
- compile ("org.igniterealtime.smack:smack-im:4.1.2") {
- exclude group: 'xpp3', module: 'xpp3'
- }
点击 "Sync Project with Gradle Files"按钮即可将smack4.1.2引入项目中
下面介绍连接和登录的方法,并带有监听收到消息的方法
- private XMPPTCPConnection con;
- private Runnable XmppThread = new Runnable(){
- <span style="white-space:pre"> </span>@Override
- public void run() {
- boolean tag = false;
- XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
- config.setHost("192.168.26.38"); //设置ejabberd主机IP
- config.setServiceName("h.com"); //设置ejabberd服务器名称
- config.setPort(5222); //设置端口号:默认5222
- config.setUsernameAndPassword("admin", "111111"); //设置用户名与密码
- config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); //禁用SSL连接
- config.setSendPresence(true);
- config.setDebuggerEnabled(true);
- con = new XMPPTCPConnection(config.build());
- try {
- con.connect();
- tag = con.isConnected();
- Roster roster = Roster.getInstanceFor(con);
- try {
- con.login();
- Log.e("TAG", "login sucess!!");
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 设置聊天监听器,监听聊天消息
- ChatManager chatm = ChatManager.getInstanceFor(con);
- chatm.addChatListener(new ChatManagerListener() {
- @Override
- public void chatCreated(Chat chat, boolean b) {
- if (!b) { //不是本地创建的会话
- chat.addMessageListener(new ChatMessageListener() {
- @Override
- public void processMessage(Chat chat, Message message) {
- Log.d("PushTest", message.toString());
- Log.d("PushTest", message.getType().toString());
- Log.d("PushTest", message.getExtension("extension").toString());
- Log.d("PushTest", message.getExtension("extension").getNamespace());
- Log.d("PushTest", message.getExtension("extension").getElementName());
- DefaultExtensionElement defaultExtensionElement = message.getExtension(
- ELEMENT_NAME,NAME_SPACE);
- String name = defaultExtensionElement.getValue("name");
- String url = defaultExtensionElement.getValue("url");
- Log.d("PushTest", name);
- Log.d("PushTest", url);
- }
- });
- }
- }
- });
- } catch (Exception e) {
- Log.e("TAG", "connect failed!" + e.toString());
- e.printStackTrace();
- }
- if(tag){
- handler.sendEmptyMessage(0x00);
- }else{
- handler.sendEmptyMessage(0x01);
- }
- }
- };
其中的
- DefaultExtensionElement defaultExtensionElement = message.getExtension(
- ELEMENT_NAME,NAME_SPACE);
- String name = defaultExtensionElement.getValue("name");
- String url = defaultExtensionElement.getValue("url");
是我在服务端发送消息时加的Message的属性拓展,定义如下:
- import org.jivesoftware.smack.packet.ExtensionElement;
- public class Received implements ExtensionElement {
- {
- private static final String NAME_SPACE = "extension";
- private static final String ELEMENT_NAME = "userinfo";
- //用户姓名元素名称
- private String nameElement = "name";
- //用户姓名元素文本(对外开放)
- private String nameText = "";
- //用户地址元素名称
- private String urlElement = "url";
- //用户地址元素文本(对外开放)
- private String urlText = "";
- @Override
- public String getElementName() {
- return ELEMENT_NAME;
- }
- @Override
- public String getNamespace() {
- return NAME_SPACE;
- }
- @Override
- public CharSequence toXML() {
- StringBuilder sb = new StringBuilder();
- sb.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAME_SPACE).append("\">");
- sb.append("<" + nameElement + ">").append(nameText).append("</"+nameElement+">");
- sb.append("<" + urlElement + ">").append(urlText).append("</"+urlElement+">");
- sb.append("</"+ELEMENT_NAME+">");
- return sb.toString();
- }
- public String getNameText() {
- return nameText;
- }
- public void setNameText(String nameText) {
- this.nameText = nameText;
- }
- public String getUrlText() {
- return urlText;
- }
- public void setUrlText(String urlText) {
- this.urlText = urlText;
- }
- }
使用时的方法如下:
- ChatManager chatm = ChatManager.getInstanceFor(mXmppConnection);
- Chat chat = chatm.createChat("ly@h.com", new ChatMessageListener() { //创建与ly的会话
- public void processMessage(Chat chat, Message message) {
- System.out.println("Received message: " + message);
- }
- });
- try {
- /**
- * 发送一条消息给ly
- */
- Received received = new Received();
- received.setNameText(name);
- Message message = new Message();
- message.setBody(context);
- message.setTo("ly@h.com");
- message.setFrom("gqw@h.com");
- message.addExtension(received);
- chat.sendMessage(message);
- } catch (SmackException.NotConnectedException e) {
- e.printStackTrace();
- }

Android studio使用smack连接xmpp服务器收发消息的更多相关文章
- Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)
XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊 ...
- JMS连接WMQ及收发消息
因为对JMS的了解也只算入门级,有些概念也很模糊,不过,卤煮会尽可能去介绍的.另外,sample code都调试过可以跑. 1.神马是JMS? jms即Java消息服务(Java Message Se ...
- Android studio Github 断开连接
http://blog.csdn.net/agoodcoolman/article/details/50562301 使用软件:Android studio svn:Github 从github直接从 ...
- android studio发布公共类库到服务器maven仓库
在上一篇中提到了怎么创建私有maven库,这篇主要结合android studio的使用,直接进入正题,看以下步骤 1.创建android项目 创建Project,然后加一个library的modul ...
- Android Studio 解决ADB检测不到手机导致无法连接的问题
ADB的全称是Android Debug Bridge,是用来管理模拟器和真机的通用调试工具. 开USB调试 方法:手机设置 - 开发人员选项 - USB调试 - 勾选(开发者调试被隐藏了,在关于手机 ...
- 【转】 Android Studio SVN 使用方法
Android Studio SVN 使用方法 如何安装配置SVN 请直接参考<SVN在Android Studio中的配置> http://www.cnblogs.com/songmen ...
- Android Studio 配置SVN实现代码管理
Refference From:http://iaiai.iteye.com/blog/2267346 一.Android Studio配置SVN Android Studio关联配置SVN很简单,在 ...
- Android studio如何使用SVN进行版本控制?
通过这两天对Android Studio的研究,终于搞通了Android Studio的基本操作及与SVN的相关关联操作(这样才能在公司的开发工作中使用):Google年底将会停止ADT插件的更新和支 ...
- 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联
看到网上很多关于svn环境配置和关联Android-Studio的很多博文,发现很零散,想集大家所长整理一下: 在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同 ...
随机推荐
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 最佳新秀Java(22)——再次了解泛型
仿制药Java SE 1.5新功能.通用自然是参数化类型.即操作数据类型被指定为一个参数.这样的参数类型可以在课堂上使用.创建的接口和方法,他们被称为通用类..泛型方法. Java语言引入泛型的优点是 ...
- MVC程序中实体框架的连接恢复和命令拦截
MVC程序中实体框架的连接恢复和命令拦截 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC ...
- IOS UI 第三篇:基本UI
工厂模式: .h文件: #import <Foundation/Foundation.h>typedef enum{ QFRed, QFYellow, QFBlu ...
- JAVA 作业:图形界面
自己动手写的一个小JAVA 程序: 一个学生管理小系统,虽然很挫,但是这我学JAVA的第一步.学了2天JAVA没有白费! import java.awt.*; import java.awt.even ...
- c语言:快速排序
练手代码(分治实现): input: int input[] = {12,6,3,9,10,6,2}; output: ======================= len = 7 input[0] ...
- 北京南天软件java工程师面试题
此试题为北京南天软件java工程师面试题(部分) 一.单项选择 (1)下列关于构造方法的叙述中,错误的是(C) A.java语言规定构造方法名与类名必须相同 B.java语言规定构造方法没有返回值,但 ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包
1.压缩文件案的用途与技术 a.用途,简单来说,就是节约磁盘空间.如果从传输角度讲,占用宽带也会小很多(Apache就有自动压缩的功能,节省宽带资源,提升网站的输出能力) b.压缩技术 ...
- CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本
CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...
- IL反编译的实用工具
初识Ildasm.exe——IL反编译的实用工具 Ildasm.exe 概要: 一.前言: 微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello Wor ...