最近在学习XMPP的使用,打算完成一个完整较为完整地Demo示例,通过这个示例掌握xmpp的使用与开发。同时打算在这个示例中学习使用一下其他的开源类库,在此作为记录学习。

包括服务器端--Openfire,客户端--Spark,XMPP 语言的实现,因此对于熟悉的Java的开发者来说不是很难。

 

Openfire的介绍

Openfire的采用Java的开发,开源的实时协作(RTC)服务器基于XMPP(Jabber的)协议。

可以您使用它轻易的构建高效率的即时通信服务器。

Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

由于是采用开放的XMPP协议,您可以使用各种支持XMPP协议的IM客户端软件登陆服务.

星火介绍

火花提供了客户端一个基本的实现,并提出了一个很好的插件架构,这对于开发者来说不能不说是一个福音。我强烈建议基于插件方式来实现你新增加的功能,而不是去改它的源代码,这样有利于你项目架构,把原始项目的影响降到最低,文章以后的部分也是基于这种插件体系进行开发的

Asmack介绍

smack的Android版本,虽然Smack在PC上可以工作的很好,功能也很强大,但在Android平台上有一些问题,而导致这些问题的原因是Android精简了Java的类库,以至Smack使用的部分类库在Android平台上无法找到,所以Smack不能直接在Android平台上使用.但在2010年初,有人在code.google.com网站上发布了一个Asmack,其中A库就代表Android中的A,也就是说,这个版本是Smack的Android版本.可使用下面地址下载Asmack:

http://code.google.com/p/asmack/downloads/list

下载asmack-2010.03.03.jar文件后,直接在Android的工程中引用即可

关系图

 

登陆操作界面:

示意说明:

1、输入用户名、密码、服务器地址,可以在搭建好openfire服务器后用spark注册账号,类似qq,多注册几个作为测试用,我用spark建立账号名和密码都为test,在此账号创建2个组,我的好友和大学同学,同时注册test1-test4的测试账号,加test为好友,当然这些都可以用代码操作,初始阶段我是这么做快速写代码测试。

2,输入错误的账号和密码会看到信息展示在登陆失败后将错误信息展示出来

3、当输入正确用户名和密码之后,进入mainActivity界面,这里将分组和所有好友以文字形式展现出来

 

代码:

XMPPManager.java

包管理器;进口org.jivesoftware.smack *;进口org.jivesoftware.smack.provider.ProviderManager;进口org.jivesoftware.smackx.GroupChatInvitation;进口org.jivesoftware.smackx.PrivateDataManager;进口org.jivesoftware.smackx.packet。 *;进口org.jivesoftware.smackx.provider *;进口org.jivesoftware.smackx.search.UserSearch;进口java.util.Collection中;进口java.util.Iterator的; / ***用户:Coolwxb*日期:14-1-13*时间:下午5:10 * / public类XMPPManager {私有静态XMPPManager例如= NULL;XMPPConnection连接= NULL;私人静态字符串URL =“10.0.0.14”;私有静态诠释端口= 5222;私人静态字符串DEVICE =“PC”;私有静态字符串username =“测试”;私有静态字符串密码=“测试”;私有静态诠释成功= 0;民营XMPPManager(){/ **管理提供商解析XMPP包的自定义XML子文档。两种类型的供应商存在:IQProvider  - 解析请求智商为Java对象。PacketExtension  - 解析附包进入PacketExtension实例XML子文档。** / ProviderManager的下午= ProviderManager.getInstance();配置(下午);} / ** *单例方法* @返回* /公共静态XMPPManager的getInstance(){如果(例如== NULL){例如=新XMPPManager();}返回实例;} / ** *获得连接连接* @返回* /公共XMPPConnection的getConnection()抛出异常{如果(连接== NULL)抛出新的异常(“请先初始化xmppconnection”);返回连接;} / ** **登陆操作返回字符串来判断登陆结果代码XMPP错误类型500 INTERNA服务器错误WAIT403禁止AUTH400bad请求MODIFY404项未找到取消409取消冲突501功能没有实现取消302走了MODIFY400 JID-畸形MODIFY406不接受MODIFY405未允许取消401未授权AUTH402所需支付-AUTH404收件人,无法等待302重定向MODIFY407注册要求的AUTH404远程服务器未找到取消504远程服务器超时等待502远程服务器错误取消500资源约束WAIT503服务不可用取消407订阅所需AUTH500不确定条件WAIT400意想不到的条件等待408请求超时取消** @参数名* @参数密码* @参数服务器* /公共字符串isLogin(字符串的用户名,密码字符串,字符串服务器){{尝试ConnectionConfiguration CF =新ConnectionConfiguration(服务器,PORT,DEVICE);cf.setDebuggerEnabled(真); //开启调试模式cf.setCompressionEnabled(假); //是否对流进行压缩cf.setSASLAuthenticationEnabled(假); //是否开启SASL登陆验证连接=新XMPPConnection(CF);connection.connect();connection.login(用户名,密码);返回SUCCESS +“”;}赶上(XMPPException五){返回e.getMessage();}}公共无效配置(ProviderManager的PM){//私有数据Storagepm.addIQProvider(“查询”,“胡言乱语:智商:私”,新PrivateDataManager.PrivateDataIQProvider()); // {Timetrypm.addIQProvider(“查询”,“胡言乱语:智商:时间”的Class.forName(“org.jivesoftware.smackx.packet.Time”));}赶上(ClassNotFoundException的E){} // XHTMLpm.addExtensionProvider(“HTML”,“http://jabber.org/protocol/xhtml-im",new XHTMLExtensionProvider()); //名册Exchangepm.addExtensionProvider(”ד,”闲聊:X:名册“新RosterExchangeProvider()); //消息Eventspm.addExtensionProvider(”ד,”闲聊:X:事件“,新MessageEventProvider()); //聊天Statepm.addExtensionProvider(”活性“,”HTTP://闲聊.ORG /协议/ chatstates“,新ChatStateExtension.Provider());pm.addExtensionProvider(“构成”,“http://jabber.org/protocol/chatstates”,新ChatStateExtension.Provider());pm.addExtensionProvider(“暂停”,“http://jabber.org/protocol/chatstates”,新ChatStateExtension.Provider());pm.addExtensionProvider(“无效”,“http://jabber.org/protocol/chatstates”,新ChatStateExtension.Provider());pm.addExtensionProvider(“水涨船高”,“http://jabber.org/protocol/chatstates”,新ChatStateExtension.Provider()); // FileTransferpm.addIQProvider(“SI”,“http://jabber.org/protocol / SI“,新StreamInitiationProvider()); //群聊Invitationspm.addExtensionProvider(”X“,”胡言乱语:X:发布会“,新GroupChatInvitation.Provider()); //服务发现#Itemspm.addIQProvider(”查询“ “http://jabber.org/protocol/disco#items",new DiscoverItemsProvider()); //服务发现#Infopm.addIQProvider(”查询“,”http://jabber.org/protocol/disco#info “新DiscoverInfoProvider()); //数据Formspm.addExtensionProvider(”ד,”闲聊:X:数据“,新DataFormProvider()); // MUC Userpm.addExtensionProvider(”ד,”HTTP://闲聊.ORG /协议/ MUC#用户“,新MUCUserProvider()); // MUC Adminpm.addIQProvider(”查询“,”http://jabber.org/protocol/muc#admin",new MUCAdminProvider()); / / MUC Ownerpm.addIQProvider(“查询”,“http://jabber.org/protocol/muc#owner",new MUCOwnerProvider()); //延迟Deliverypm.addExtensionProvider(”X“,”胡言乱语:X:延时“新DelayInformationProvider()); // Versiontry {pm.addIQProvider(“查询”,“胡言乱语:智商:版”的Class.forName(“org.jivesoftware.smackx.packet.Version”));}赶上(ClassNotFoundException的E){} // VCardpm.addIQProvider(“电子名片”,“名片-TEMP”,新VCardProvider()); //离线消息Requestspm.addIQProvider(“离线”,“http://jabber.org/protocol/offline",new OfflineMessageRequest.Provider()); //离线消息Indicatorpm.addExtensionProvider(“离线”,“http://jabber.org/protocol/offline”,新OfflineMessageInfo.Provider()); //最后Activitypm.addIQProvider(“查询“,”胡言乱语:智商:最后一个“,新LastActivity.Provider()); //用户Searchpm.addIQProvider(”查询“,”胡言乱语:智商:搜索“,新UserSearch.Provider()); // SharedGroupsInfo.Provider()); // JEP-33:扩展诗节Addressingpm.addExtensionProvider(“地址”,“http://jabber.org/protocol/address”,新MultipleAddressesProvider());} / ** *返回组信息的容器* @参数名册* @返回* /公众的Iterator <RosterGroup> getGroups(名册名单){收藏<RosterGroup> rosterGroups = roster.getGroups();返回rosterGroups.iterator();}}

&#160;

这里写了个XMPPManager作为帮助类,主要重要的方法就是对xmppconnection做初始化,可看到configure方法对用xml描述的xmpp包做解析,官方文档是这样对ProviderManager这个类做解释:

&#160;

管理解析XMPP包的自定义XML子文档供应商。
两种类型的供应商存在:IQProvider  - 解析请求智商为Java对象。
PacketExtension  - 解析附包XML子文档
到PacketExtension实例。

&#160;

LoginActivity.java

包com.example.XMPPDemo;进口android.app.Activity;进口android.app.ProgressDialog;进口android.content.Intent;进口android.os.AsyncTask;进口android.os.Bundle;进口android.util.Log;进口android.view.View;进口android.widget.Button;进口android.widget.EditText;进口android.widget.TextView;进口manager.XMPPManager;进口org.jivesoftware.smack.XMPPConnection; / ***用户:Coolwxb*日期:14-1-13*时间:下午5:18 * / public类LoginActivity扩展活动{私人XMPPManager xmppManager;私人XMPPConnection xmppConnection;私人按钮btn_login;私人的EditText et_username;私人的EditText et_password;私人的EditText et_server;私人TextView的tv_info;ProgressDialog PD;@Overrideprotected无效的onCreate(捆绑savedInstanceState){super.onCreate(savedInstanceState);的setContentView(R.layout.login);et_password =(EditText上)findViewById(R.id.et_password);et_username =(EditText上)findViewById(R.id.et_username);et_server =(EditText上)findViewById(R.id.et_server);tv_info =(的TextView)findViewById(R.id.tv_info);btn_login =(按钮)findViewById(R.id.btn_login);btn_login.setOnClickListener(新View.OnClickListener(){@Overridepublic无效的onClick(视图v){登录();}});}私人无效登录(){新的AsyncTask <String,字符串,字符串>(){字符串username =“”;字符串密码=“”;字符串服务器=“”;@Overrideprotected无效onPreExecute(){用户名= et_username.getText()的toString()修剪()。。密码= et_password.getText()的toString()修剪();服务器= et_server.getText()的toString()修剪()。xmppManager = XMPPManager.getInstance();PD =新ProgressDialog(LoginActivity.this);pd.setTitle(“提示”);pd.setMessage(“正在登陆......”);pd.show();}@Overrideprotected字符串doInBackground(字符串...字符串){返回xmppManager.isLogin(用户名,密码,服务器);}@Overrideprotected无效onPostExecute(字符串信息){pd.dismiss();如果(“0”.equals(信息)){//成功登陆SUCCESSIntent意图=新意图();intent.setClass(LoginActivity.this,MainActivity.class);startActivity(意向);}其他{Log.e(“错误”的信息);tv_info.setText(信息);}}} .execute(NULL,NULL,NULL);}
}

这里使用了一个机器人的异步线程类AsyncTask,在doInBackground方法中做一些耗时的操作,我试过如果不加入线程中操作的话会出现假死现象,所以在这里我将登陆连接放入了线程中.

&#160;

MainActivity.java

包com.example.XMPPDemo;进口android.app.Activity;进口android.os.Bundle;进口android.util.Log;进口android.widget.TextView;进口manager.XMPPManager;进口org.jivesoftware.smack.Roster;进口org.jivesoftware.smack.RosterEntry;进口org.jivesoftware.smack.RosterGroup;进口java.util.Collection中;进口java.util.Iterator的; / ***用户:Coolwxb*日期:14-1-13*时间:下午6:28 * / public类MainActivity延伸活动{XMPPManager xmppManager;私人TextView的tv_groupInfo;@Overrideprotected无效的onCreate(捆绑savedInstanceState){super.onCreate(savedInstanceState);的setContentView(R.layout.activity_main);tv_groupInfo =(的TextView)findViewById(R.id.tv_groupinfo);xmppManager = XMPPManager.getInstance();名册名册= NULL;尝试{名册= xmppManager.getConnection()getRoster()。}赶上(例外五){e.printStackTrace();}迭代器<RosterGroup> rosterGroupIterator = xmppManager.getGroups(名册);StringBuilder的SB =新的StringBuilder(); //获取所有组信息,如果(rosterGroupIterator.hasNext()){//如果有分组,而(rosterGroupIterator.hasNext()){RosterGroup rosterGroup = rosterGroupIterator.next();串组名= rosterGroup.getName();诠释计数= rosterGroup.getEntryCount();sb.append(rosterGroup.getName()+“\ r \ n”);}tv_groupInfo.setText(“组信息:+ \ r \ n”+ sb.toString());}其他{tv_groupInfo.setText(“没有组信息”);} //获取所有人集合<RosterEntry> =迭代器roster.getEntries();迭代器<RosterEntry> entryIterator = iterator.iterator();SB =新的StringBuilder();而(entryIterator.hasNext()){RosterEntry rosterEntry = entryIterator.next();sb.append(rosterEntry.getName()+“\ r \ n”);}串二= sb.toString();Log.i(“信息”,二);tv_groupInfo.append(“所有的成员:+ \ r \ n”+ II);}
}

MainActivity的界面中我只放入了一个textview,用来显示分组信息和成员。因为在操作开始我用spark向test这个账号建立了分组和好友,所以会获取到。

登陆就介绍到这里,跳转到mainactivity获取组信息和成员信息涉及比较多的常用类,打算专门研究下专门写一章。

&#160;

最后附上一些比较重要的东东,希望大家会喜欢,同时也希望大家提出宝贵意见,大家共同进步。

&#160;

登陆源码:

要XMPP登陆DEMO源码的点我!....

XMPP学习——2、用户登录相关推荐

  1. 【Servlet】ServletContext、ServletConfig对象学习、用户登录系统完善

    总结:request.cookie.session.context的区别 这四个对象有不同级别的作用域和生命周期. (1)request:解决了一次请求内的数据共享问题(作用域:一次请求) req.s ...

  2. Python学习笔记——用户登录测试

    初学Python语言,做点笔记,希望能坚持下去 #!/usr/bin/env python -- coding:utf-8 - #初始化账号和密码 a=input('Please enter init ...

  3. SpringMVC学习之用户登录(二)

    要点:参数传递和接受的各种方式 参考资料:http://lydia-fly.iteye.com/blog/2152073 参考资料:http://blog.csdn.net/z69183787/art ...

  4. session学习总结-用户登录及一次性校验码案例

    一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码. 服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单 ...

  5. Linux学习(五)---开机、重启和用户登录注销

    文章目录 Linux学习--开机.重启和用户登录注销 一.开机&重启命令 二.用户登录和注销 Linux学习–开机.重启和用户登录注销 一.开机&重启命令 基本介绍: ①shutdow ...

  6. 【iOS XMPP】使用XMPPFramewok(二):用户登录

    用户登录 准备工作 比较知名的开源XMPP服务器:一个是Openfire,一个是ejabberd Openfire 使用 Java 语言编写,比较容易上手,地址:http://www.ignitere ...

  7. oracle 触发器登录,【学习笔记】Oracle触发器 实现指定用户登录oracle案例

    天萃荷净 触发器实现指定用户登录oracle,分享一篇关于Oracle数据库安全策略,通过Oracle触发器实现限定user用户登录Oracle数据库的方法 1.创建允许登录用户表 CREATE TA ...

  8. Linux学习笔记(四)之用户登录

    1.Linux是一个网络操作系统,作为多用户,多任务的操作系统,其系统资源是所有用户共享的.任何要使用系统资源者必须先在系统内登记,注册,即开设用户账号,该账号又包含用户名,口令,所用的shell,使 ...

  9. Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能

    Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...

  10. Vue + Spring Boot 学习笔记01:实现用户登录功能

    Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...

最新文章

  1. unity 2d 游戏优化之路 遇坑记录
  2. 全方位,多角度理解ThreadLocal
  3. ue4 开发动作游戏_【图片】第三人称动作游戏开发日志【虚幻4吧】_百度贴吧
  4. 磁盘调度算法java代码
  5. android 锁屏解决方案,Android 实现锁屏的较完美方案
  6. 前端vue显示柱状图_Vue接入Echarts 显示柱状图饼图
  7. react-native init MyProject之后发生了什么
  8. 怎样开始学习ERP?
  9. 网络无人值守安装linux----kickstart
  10. C# 向Com口发送数据
  11. 电商促销页面需要的辅助图形给设计师准备好了,拿走!
  12. 图片配置文件设置 索尼a7s2_16组Sony索尼系列相机Slog2和Slog3常用Vlog灰片视频电影LTUS调色预设...
  13. python解析xml存入字典_如何将xml字符串转换为字典?
  14. Spring Session + Redis 实现 Session 共享,附带 Nginx 集群
  15. 10个最好的免费响应式Joomla模板
  16. 【数学建模算法汇总】
  17. Python人脸检测实战之疲劳检测
  18. 爬虫小练习:堆糖图片抓取--爬虫正式学习day1
  19. 一个程序员的平凡日常
  20. error in ./node_modules/@lit/reactive-element/decorators/state.jsModule parse failed: Unexpected

热门文章

  1. 蒙娜丽莎的微笑 css版
  2. pytorch自定义DataSet
  3. 6-7 判断回文字符串
  4. 四川建院计算机专业升本学校,四川哪些专科学校可以升本
  5. 汉诺塔算法的两种实现思路
  6. 漫谈IT项目团队管理心得
  7. 云服务器免费suse系统,linux操作系统suse
  8. 台式电脑怎么添加计算机硬盘,台式机如何添加硬盘扩大存储空间|如何对新添加的硬盘进行分区...
  9. Arduino小白学习记录:用电位器控制LED灯的亮度
  10. 如何比较两个APK包签名是否一致