最近闲的蛋疼,研究了下xmpp即时通讯,有些许收获,拿出来跟大家分享一下吧,欢迎指点和讨论!废话不多说,开始搞事情。

步骤一:测试环境配置。

1.下载openfire服务器相关配置

下载链接:https://www.igniterealtime.org/downloads/index.jsp

安装配置参考:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html

注:配置教程中我是直接下载安装的exe文件。

按照该教程操作完全部流程后,我们应该登录上了openfire服务器了。可是现在只有admin这个屌丝用户,没有妹子怎么撩呢?

大家莫慌,下面我们开始造几个妹子。操作如下:

到此为止,妹子的问题已经解决了。开始撩吧。

2.下载spark客户端(注:博主是下载的windows PC端的)

这个spark咱仅仅拿来测试用,仅此而已。

下载链接:https://www.igniterealtime.org/downloads/index.jsp

如果安装完成,用户创建好了,登录时遇到问题,请参考:http://blog.csdn.net/oniejianjun/article/details/72673782

至此代码以外的环境已经配置好了。

步骤二:开始撸代码,具体解释看代码的注释部分。

1.在gradle中配置smack所需要的包。

compile 'org.igniterealtime.smack:smack-android:4.1.4'

compile 'org.igniterealtime.smack:smack-tcp:4.1.4'

compile 'org.igniterealtime.smack:smack-im:4.1.4'

compile 'org.igniterealtime.smack:smack-extensions:4.1.4'

2.万事俱备了,进入正文!

2.2.1.首先,建一个单例,来初始化我们的XMPPTCPConnection,当然你也可以直接用XMPPTCPConnnection初始化,不用像我这样再写一个类。

public class MyXMPPTCPConnection extends XMPPTCPConnection {

private static MyXMPPTCPConnection connection;

private MyXMPPTCPConnection(XMPPTCPConnectionConfiguration config) {

super(config);

}

public static synchronized MyXMPPTCPConnection getInstance(){

//初始化XMPPTCPConnection相关配置

if(connection == null){

XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();

//设置连接超时的最大时间

builder.setConnectTimeout(10000);

//设置登录openfire的用户名和密码

builder.setUsernameAndPassword("guochen", "guochen");

//设置安全模式

builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);

builder.setResource("Android");

//设置服务器名称

builder.setServiceName("192.168.0.245");

//设置主机地址

builder.setHost("192.168.0.245");

//设置端口号

builder.setPort(5222);

//是否查看debug日志

builder.setDebuggerEnabled(true);

connection = new MyXMPPTCPConnection(builder.build());

}

return connection;

}

}

现在connection的实例有了,我们开始连接openfire服务器吧。

if(connection != null){

//如果没有连接openfire服务器,则连接;若已连接openfire服务器则跳过。

if(!connection.isConnected()){

connection.connect();

}

}

没错,就这么简单,只要调用connect()方法即可。当然如果你想监听connect状态,你可以给XMPPTCPConnection对象添加监听

connection.addConnectionListener(this);

2.2.2.然后,我们开始登录账号吧~~,登录代码也很简单。

if(connection.isConnected()){

//第一个参数是 用户名(即你在openfire服务器用户管理页面创建的用户名)

//第二个参数是 用户密码(同上)

//connection.login("用户名", "密码")

connection.login(params[0].get(0), params[0].get(1));

}

如果登录成功了,那么spark上就能看到好友在线了(前提:spark上 登录的用户 和 代码中login方法登录的用户 是好友关系)。

2.2.3.接着,获取好友列表,代码如下:

Listfriends = new ArrayList();

//通过Roster.getInstanceFor(connection)获取Roast对象;

//通过Roster对象的getEntries()获取Set,遍历该Set就可以获取好友的信息了;

for(RosterEntry entry : Roster.getInstanceFor(connection).getEntries()){

Friend friend = new Friend(entry.getUser(), entry.getName());

friends.add(friend);

}

目前我研究看来,该方法好像只能获取自己的好友信息。(注:Friends类是我自己新建的一个model类,有两个属性,好友昵称 和 好友ID)。

2.2.4 最后来看聊天功能,代码如下:

先获取ChatManager对象,并且给该对象添加ChatListener

connection = MyXMPPTCPConnection.getInstance();

if(connection != null){

chatManager = ChatManager.getInstanceFor(connection);

chatManager.addChatListener(this);

}

再获取Chat对象

if(chatManager != null){

//第一个参数是 用户的ID

//第二个参数是 ChatMessageListener,我们这里传null就好了

chat = chatManager.createChat(friendJid, null);

}

然后对于上面的ChatListener和ChatMessageListener两个接口给予实现

//ChatListener中需要重写的方法

@Override

public void chatCreated(Chat chat, boolean createdLocally) {

//在这里面给chat对象添加ChatMessageListener

chat.addMessageListener(this);

}

//ChatMessageListener中需要重写的方法

//当接收到对方发来的消息的时候,就会回调processMessage方法

@Override

public void processMessage(Chat chat, Message message) {

if(message.getType().equals(org.jivesoftware.smack.packet.Message.Type.chat) || message.getType().equals(org.jivesoftware.smack.packet.Message.Type.normal)){

if(message.getBody() != null){

android.os.Message msg = android.os.Message.obtain();

msg.what = 0;

msg.obj = message.getBody();

handler.sendMessage(msg);

}

}

}

上面processMessage方法中处理接收到的消息,那么发送消息呢?继续往下看~~

//发送消息,参数为发送的消息内容

chat.sendMessage(msgContent);

没了,简单吧!就是chat对象调用一下sendMessage方法。

Demo源码地址:https://github.com/kakushinn/XmppDemo

大功告成,这样就可以实现简单的聊天了。我也是新手,希望有什么好的建议或意见可以提出来一起讨论,一起学习。

smack android 示例代码,android客户端xmpp smack openfire简单开发实例相关推荐

  1. smack android 示例代码,Android smack4.2的简单使用

    1.使用背景 在搭建即时通讯的时候,一般采用Openfire+smack实现(如:第三方环信 ).由于Asmack已经废弃.所以先使用官方最新库 : GitHub上的指导 2.使用大致流程 2.1新建 ...

  2. smack android 示例代码,Smack-Android客户端入门一

    不管是项目中要使用还是自己做demo玩,即时通信,消息推送应该很多人也会接触到,在这里,记录下自己在学习Smack-Android中碰到的问题,也备查询,也许也能帮助要入门的伙伴们一些帮助.服务端基于 ...

  3. 【译】用Fragment创建动态的界面布局(附Android示例代码)

    原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...

  4. android 共享代码,Android团队成员间的代码共享!(Git+Github版)

    原创,转载请说明出处. 一. 这篇文章要解决什么问题,能学习到什么? 在android团队的开发中,少不了与队员之间的合作.为了避免我们傻瓜式地复制粘贴对方的负责的那部分功能代码,我们可以用svn或者 ...

  5. 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码

    自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...

  6. android gravity 代码,android:layout_gravity和android:gravity属性的区别

    android:gravity / android:layout_gravity区别: android:gravity 是设置该view类里面的内容相对于该view的位置,例如设置button里面的t ...

  7. Android变调代码,Android 之 Fmod 变音的实现

    一.下载fmod库 二.创建项目(Android Studio) 三.配置项目 四.DEMO开发 五.最后介绍一下 变音参数DPS的类型 image.png image.png image.png 解 ...

  8. android扔骰子代码,Android实现掷骰子效果

    本文实例为大家分享了android实现掷骰子效果的具体代码,供大家参考,具体内容如下 利用handler接受子线程的消息完成骰子点数的不断更替 演示 start:开始游戏 stop:停止游戏 reco ...

  9. android声控代码,Android Studio 第七十一期 - Android 系统声音控制

    //写一个函数,实现一个整形有序数组的二分查找 //#include //int sum(int arr[],int x,int a) //{ //int laft = 0; //int right  ...

  10. android滴滴打车代码,Android 端滴滴打车接口的开发

    前两天做了一个对Android端'滴滴打车'的接口开发吧! 今天来做个简单的流程, 滴滴会提供这样一个接口, http://webapp.diditaxi.com.cn/? maptype=wgs&a ...

最新文章

  1. 【微读书】《人工智能颠覆未来战争》连载之一:机器战胜人类?——AlphaGo人机对战的启示...
  2. spring mvc静态资源访问的配置
  3. phpcms文件结构
  4. Detected call of `lr_scheduler.step()` before `optimizer.step()`.
  5. ArrayList 有序集合 c#
  6. maven学习(4)
  7. arcgis分隔图层重复出文件_ArcGIS制图技巧讲解,处理好细节才能让图更专业!
  8. OTA时代来了!由新一代私有云揭开序幕
  9. 在线Cron表达式生成器,定时任务表达式生成器
  10. 手把手教你搭建微信小程序服务器(HTTPS)
  11. python(分隔符)
  12. 0.1+0.2 为什么不等于0.3
  13. 正则表达式 基本汉字 特殊字符
  14. 【转载】整车CAN网络介绍
  15. 集成 Jenkins 和 TestNG 实现自助式自动化测试平台
  16. 电脑图片去水印方法-电脑图片上面的水印怎么去除
  17. 小程的自学编程路途起点
  18. 科学松鼠会--压缩感知
  19. 时间复杂度的表示方式
  20. WM6模拟器(测试软件的好工具)使用手册

热门文章

  1. 各位有没有遇到过这样的问题?
  2. 为什么环境变量中设置了JDK版本为1.7,但是在cmd中java -version 是1.8版本
  3. jQuery 的 ajax 请求方法
  4. Thinkphp结合phpqrcode生成二维码海报代码
  5. 使用jquery获取ul中当前正在点击的li的索引
  6. Buildroot make网卡interfaces文件被修改
  7. 【剑指offer】扑克牌的顺子
  8. java类加载器和父类委托机制
  9. oracle启动数据库错误
  10. Hard lockup occurs due to an infinite loop encountered in distribute_cfs_runtime()