android利用xmpp进行即时通信
2016-01-13 21:37
567 查看
简单介绍:什么是即时通信?类似于QQ聊天一样,不对,介绍理论不是我的风格,直接进入主题!
现在比较常用的软件是OpenFire做服务器,Spark做测试客户端(这是通用的,也有的公司是自己做的例如QQ)
下载地址:http://www.igniterealtime.org/downloads/index.jspOpenFire安装指导:http://www.tuicool.com/articles/bYfeAnU
设置OpenFire网址:http://127.0.0.1:9090 (这里也可以根据安装指导去做,但是我用的时候,有时会碰到OpenFire打不开的情况 )
需要的Jar包:
下载地址:http://download.csdn.net/detail/zhengyikuangge/9402975①添加权限(AndroidMainfest.xml)
<uses-permission android:name="android.permission.INTERNET" />
②连接OpenFire服务器和发送数据代码方法:
public static XMPPConnection conn; //声明一个全局变量 public void send() throws XMPPException { ConnectionConfiguration cc = new ConnectionConfiguration( "192.168.56.1", 5222); //第一个参数为IP地址,第二个参数为端口号 conn = new XMPPConnection(cc); //创建连接对象 conn.connect(); //开始连接...... conn.login("zhangwenqi", "154211"); //账号和密码 在OpenFire中创建的账号和密码 Chat chat = conn.getChatManager().createChat( "zhang" + "@" + conn.getServiceName() /*创建一个聊天窗口,‘zhang’是接收方的名 字,conn.getServiceName()是服务器名字*/, new MessageListener() { @Override public void processMessage(Chat arg0, Message arg1) { // TODO Auto-generated method stub Log.e("111", arg1.getBody() + "1542"); // 返回接收数据,重复接收 } }); Message msg = new Message(); msg.setBody("zwq"); /* 注意这里的message是 org.jivesoftware.smack.packet.Message 是专门用于xmpp即时通讯使用的*/ chat.sendMessage(msg); //发送数据 }
③创建一个线程执行②中的方法即可。
这是费了一天的时间才研究出来的,多亏以前学过连接web服务器要不然今天是够呛啊,明天再研究研究然后再完善~~
安卓客户端实现在OpenFire服务器注册用户:
/** * 注册 * * @param account 注册帐号 * @param password 注册密码 * @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败 */ public String regist(String account, String password) { if (conn == null) return "0"; Registration reg = new Registration(); reg.setType(IQ.Type.SET); reg.setTo(conn.getServiceName()); // 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。 reg.setPassword(password); reg.addAttribute("android", "geolo_createUser_android"); // 这边addAttribute不能为空,否则出错。 // 所以做个标志是android手机创建的吧!!!!! PacketFilter filter = new AndFilter(new PacketIDFilter( reg.getPacketID()), new PacketTypeFilter(IQ.class)); PacketCollector collector = conn.createPacketCollector(filter); conn.sendPacket(reg); IQ result = (IQ) collector.nextResult(SmackConfiguration .getPacketReplyTimeout()); // Stop queuing results collector.cancel();// 停止请求results(是否成功的结果) if (result == null) { Log.e("RegistActivity", "No response from server."); return "0"; } else if (result.getType() == IQ.Type.RESULT) { return "1"; } else { // if (result.getType() == IQ.Type.ERROR) if (result.getError().toString().equalsIgnoreCase("conflict(409)")) { Log.e("RegistActivity", "IQ.Type.ERROR: " + result.getError().toString()); return "2"; } else { Log.e("RegistActivity", "IQ.Type.ERROR: " + result.getError().toString()); return "3"; } } }
这段代码的原地址:
http://blog.csdn.net/h7870181/article/details/8653865
感觉挺不错的
相关文章推荐
- Android中怎么用this
- 我的Android进阶之旅------>Android Activity的singleTask加载模式和onActivityResult方法之间的冲突
- Android应用开发中模拟按HOME键效果
- 一些Android大牛的博客链接收集
- android学习项目
- 浅谈Android控件中的ListView优化
- Android客户端与服务器通信方式浅谈
- Android 选择时间,并排序
- Android性能优化典范(四)
- Android自学的感受
- Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1
- 两分钟彻底让你明白Android Activity生命周期(图文)!
- Android MVC MVP
- android 5大进程等级
- android头像设置:从本地照片库或拍照获取并剪裁
- Android退出所有Activity最优雅的方式
- android 点击Edittext时hint值不自动隐藏问题
- android 意图和四大组件
- Android - 资源的定义和引用
- Android开发实践:如何设置NDK的编译选项