最近闲的蛋疼,研究了下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.接着,获取好友列表,代码如下:

List friends = 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中需要重写的方法@Overridepublic void chatCreated(Chat chat, boolean createdLocally) {    //在这里面给chat对象添加ChatMessageListener    chat.addMessageListener(this);}//ChatMessageListener中需要重写的方法//当接收到对方发来的消息的时候,就会回调processMessage方法@Overridepublic 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

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

更多相关文章

  1. android webkit 网页标签的解析与预下载的实现
  2. Android关于Activity屏蔽/拦截Home键
  3. android手机屏幕横竖屏切换禁止调用生命周期函数方法
  4. 【android】 百度地图应用开发(一)
  5. Unity头像上传功能实现 二
  6. 深入浅出Android(安卓)Handler
  7. Handler 消息传递机制介绍
  8. Unity3D 调用Android原生方法2
  9. android中actionBar中字体颜色设置

随机推荐

  1. Android强制在主线程进行网络请求
  2. Android中如何获取应用版本号
  3. Android全局变量
  4. Android电池电量状态源码
  5. Android双击返回键退出程序
  6. Android之NetworkOnMainThreadException
  7. Android(安卓)Layout Tricks #3: Optimiz
  8. 设置android全屏的两种方式
  9. Android中Activity的Intent大全
  10. android 获取图片绝对地址