基于XMPP 、openfire 、asmack的 android 聊天客户端(1)

最近的项目是 社交,用到了 即时通信,项目通信 是由 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);



你可能感兴趣的:(基于XMPP 、openfire 、asmack的 android 聊天客户端(1))