首先第一、与服务器建立好连接
关键代码:127.0.0.1为服务器IP,5222为服务器端口号
/** * 连接服务器 * * @return */ public boolean conServer() { ConnectionConfiguration config = new ConnectionConfiguration( 127.0.0.1, 5222); /** 是否启用安全验证 */ config.setSASLAuthenticationEnabled(false); /** 是否启用调试 */ // config.setDebuggerEnabled(true); /** 创建connection链接 */ try { connection = new XMPPConnection(config); /** 建立连接 */ connection.connect(); return true; } catch (XMPPException e) { e.printStackTrace(); } return false; }
第二、实现注册
关键代码:
以下代码注释都很清楚了,如有不懂的地方可以留言,这里就不多做解释了。
/** * 注册 * * @param account 注册帐号 * @param password 注册密码 * @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败 */ public String regist(String account, String password) { if (connection == null) return "0"; Registration reg = new Registration(); reg.setType(IQ.Type.SET); reg.setTo(ClientConServer.connection.getServiceName()); reg.setUsername(account);// 注意这里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 = ClientConServer.connection .createPacketCollector(filter); ClientConServer.connection.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"; } } }
第三、实现登录
关键代码: 代码很简单不做太多解释
/** * 登录 * * @param a 登录帐号 * @param p 登录密码 * @return */ public boolean login(String a, String p) { try { if (connection == null) return false; /** 登录 */ connection.login(a, p); return true; } catch (Exception e) { e.printStackTrace(); } return false; }
第四、修改密码
关键代码:同样很简单
/** * 修改密码 * @param connection * @return */ public static boolean changePassword(XMPPConnection connection,String pwd) { try { connection.getAccountManager().changePassword(pwd); return true; } catch (Exception e) { return false; } }
第五、更改用户状态
关键代码:好吧,代码有点多,不过很清晰
/** * 更改用户状态 */ public void setPresence(int code) { if (connection == null) return; Presence presence; switch (code) { case 0: presence = new Presence(Presence.Type.available); connection.sendPacket(presence); Log.v("state", "设置在线"); break; case 1: presence = new Presence(Presence.Type.available); presence.setMode(Presence.Mode.chat); connection.sendPacket(presence); Log.v("state", "设置Q我吧"); System.out.println(presence.toXML()); break; case 2: presence = new Presence(Presence.Type.available); presence.setMode(Presence.Mode.dnd); connection.sendPacket(presence); Log.v("state", "设置忙碌"); System.out.println(presence.toXML()); break; case 3: presence = new Presence(Presence.Type.available); presence.setMode(Presence.Mode.away); connection.sendPacket(presence); Log.v("state", "设置离开"); System.out.println(presence.toXML()); break; case 4: Roster roster = connection.getRoster(); Collection<RosterEntry> entries = roster.getEntries(); for (RosterEntry entry : entries) { presence = new Presence(Presence.Type.unavailable); presence.setPacketID(Packet.ID_NOT_AVAILABLE); presence.setFrom(connection.getUser()); presence.setTo(entry.getUser()); connection.sendPacket(presence); System.out.println(presence.toXML()); } // 向同一用户的其他客户端发送隐身状态 presence = new Presence(Presence.Type.unavailable); presence.setPacketID(Packet.ID_NOT_AVAILABLE); presence.setFrom(connection.getUser()); presence.setTo(StringUtils.parseBareAddress(connection.getUser())); connection.sendPacket(presence); Log.v("state", "设置隐身"); break; case 5: presence = new Presence(Presence.Type.unavailable); connection.sendPacket(presence); Log.v("state", "设置离线"); break; default: break; } }
第六:注销
关键代码:很简单吧!
/** * 删除当前用户 * @param connection * @return */ public static boolean deleteAccount(XMPPConnection connection) { try { connection.getAccountManager().deleteAccount(); return true; } catch (Exception e) { return false; } }
好吧,这篇就先介绍到这!