最近的项目是 社交,用到了 即时通信,项目通信 是由 openfire 服务端, asmack 客户端 。 几月xmpp 实现的。那我就简单介绍下客户端 的实现过程吧。
先讲下思路,
1,在启动应用的MainActivity 链接openfire服务器。
具体实现:
在mainactivity 中调用 LoginOpenfire()这个方法。
看下 这个方法体
/** * 登录Openfire * * @param isOffMessage * 是否要获取离线消息,true:获取,false:不获取 * @return */ public void LoginOpenfire(final boolean isOffMessage) { this.isOffMessage = isOffMessage; final Visitor visitor = BaseLoginUtil.readVistor(this); if (!BaseLoginUtil.checkLogin(this) && visitor == null) { return; } if (isLogining) { return; } isLogining = true; final User user = BaseLoginUtil.readUser(this); Thread thread = new Thread() { public void run() { boolean result = false; try { ConnectionUtils.logout(getApplicationContext()); OfflineMessageManager offlineManager = null; if (isOffMessage) { offlineManager = new OfflineMessageManager(ConnectionUtils.getConnection()); } String name = null; String password = null; if (user != null) { name = user.userAccount.replace("@", "wpk"); if ("2".equals(user.userType) || "3".equals(user.userType)) { password = user.userPassword; } else { password = name; } } else if (visitor != null) { name = visitor.user_account; password = name; } ConnectionUtils.getConnection().login(name, password); if (null != offlineManager) { getOfflineMessage(offlineManager); } Presence presence = new Presence(Presence.Type.available); ConnectionUtils.getConnection().sendPacket(presence); Intent chatServer = new Intent(MainActivity.this, IMChatService.class); startService(chatServer); if (!ConnectionUtils.getConnection().isAuthenticated()) { result = false; } else { result = true; // getOnlineMessage(); } chatServer=null; presence=null; offlineManager=null; } catch (Exception e) { result = false; e.printStackTrace(); } isLogining = false; if (!result) { sendOpenFireErrMsg(); } else { Sessions.isLoginOfSuccess = true; sendOpenFireOkMsg(); } }; }; thread.start(); }
因为链接openfire 为耗时操作,所以放在子线程中执行,那么这个方法的我们就看子线程就可以了。
子线程中首先 调用 ConnectionUtils.logout(getApplicationContext()); 登出openfire。
来看下登出openfire的方法体:
/** * 登出openfire * * @param context */ public static void logout(Context context) { if (connection != null) { connection.disconnect(); } context.stopService(new Intent(context, IMChatService.class)); context.stopService(new Intent(context, IMContactService.class)); // connection = null; }其实就是断开链接,并且停止了两个服务。 这两个服务是干什么的呢? 一个是监听好友请求 一个是监听 系统消息的。
登出openfire 后 执行 ConnectionUtils.getConnection().login(name, password); 登陆openfire。
这个login()方法 没什么好说的,就是拿到链接登陆。
那看下怎么拿到这个connection, ConnectionUtils.getConnection().
public static XMPPConnection getConnection() { if (ConnectionUtils.connection == null) { initServiceDiscoveryManager(); try { ConnectionUtils.connection = new XMPPConnection(connectionConfig); } catch (Exception e) { e.printStackTrace(); } } if (!ConnectionUtils.connection.isConnected()) { try { ConnectionUtils.connection.connect(); } catch (XMPPException e) { e.printStackTrace(); } } return ConnectionUtils.connection; }
首先 定义变量 private static XMPPConnection connection; 对其实现初始化。 创建一个 XMPPConnection 对象
ConnectionUtils.connection = new XMPPConnection(connectionConfig);并 执行connect方法进行连接。
此时ConnectionUtils.getConnection()这个方法做了什么我们已经知道了。执行
ConnectionUtils.getConnection().login(name, password);方法登陆后
if (null != offlineManager) {
getOfflineMessage(offlineManager);
}
获取离线消息。这是获取openfire 替我们保存的消息, 用到了 offlineManager 这个对象,前面初始化过。
这两句代码的意思是 登陆后的状态 ,也就是 在线离开,。通过Presence的参数觉得
Presence presence = new Presence(Presence.Type.available);
ConnectionUtils.getConnection().sendPacket(presence);
这个服务主要是一个监听系统消息的
Intent chatServer = new Intent(MainActivity.this, IMChatService.class);
startService(chatServer);