Android smack 工具类(包含连接及相关方法)

public class XmppUtil {

	/**
	 * XMPP连接
	 */
	private static XMPPTCPConnection mXMPPConnection;

	/**
	 * 单聊管理器
	 */
	private static ChatManager mChatManager;

	/**
	 * smack ping openfire管理器
	 */
	private static PingManager mPingManager;

	/**
	 * 群聊管理器
	 */
	private static MultiUserChatManager multiUserChatManager;

	/**
	 * XMPP连接监听
	 */
	private static CheckConnectionListener checkConnectionListener;

	/**
	 * smack ping openfire失败监听
	 */
	private static PingServerFailedListener pingServerFailedListener;

	/**
	 * 单聊接收监听
	 */
	private static MsgListener msgListener;

	/**
	 * 单聊发送监听
	 */
	private static OutChatListener mOutChatListener;

	/**
	 * 监听邀请加入聊天室
	 */
	private static MucInvitationListener mucInvitationListener;

	/**
	 * 好友状态更新监听
	 */
	private static FriendsPacketListener friendsPacketListener;

	static {
		try {
			Class.forName("org.jivesoftware.smack.ReconnectionManager");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 *
	 * @return XMPPConnection是否连接并登陆
	 */
	public static boolean xmppIsConncetedAndLogin() {
		return mXMPPConnection != null && mXMPPConnection.isConnected() && mXMPPConnection.isAuthenticated();
	}

	/**
	 * 初始化XMPPConnection并建立连接
	 */
	public static synchronized void initXMPP() {
		// 已经连接并登陆上
		if (xmppIsConncetedAndLogin()) {
			return;
		} else {
//			disconnect(); // 先断开连接
			initXMPPConfig();
			connectXMPP();
		}
	}

	private static void initXMPPConfig() {
		try {
			SmackConfiguration.DEBUG = true;
			// 配置XmppConnection
			XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
					.setHostAddress(InetAddress.getByName(Const.XMPP_HOST)) // 设置openfire主机IP
					.setXmppDomain(Const.XMPP_DOMAIN)
					.setHost(Const.XMPP_HOST)
					.setPort(Const.XMPP_PORT)
					.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) //禁用SSL连接
					.setCompressionEnabled(false)
					.setSendPresence(false) // 先设离线获取离线消息后再设在线
					.setCompressionEnabled(true) // 设置开启压缩,可以节省流量
					.setConnectTimeout(30000)
					.build();
			// 收到好友邀请后manual表示需要经过同意,accept_all表示不经同意自动为好友
			Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
			mXMPPConnection = new XMPPTCPConnection(config);
			//开启重联机制
			ReconnectionManager mReconnectionManager = ReconnectionManager.getInstanceFor(mXMPPConnection);
//			mReconnectionManager.setFixedDelay(5);
			mReconnectionManager.enableAutomaticReconnection();
		} catch (Exception e) {
			AppLog.debug(XmppUtil.class, "XMPP 配置失败---" + e.getMessage());
		}
	}

	/**
	 * 连接XMPP
	 */
	public static void connectXMPP() {
		try {
			mXMPPConnection.connect();
			AppLog.debug(XmppUtil.class, "XMPP连接结果---" + mXMPPConnection.isConnected());
			// 使用所有用户统一密码123,需要含参数Resourcepart.from("Smack"),不然每次自动分配一个名字,导致掉线重连的话在openfire看连接名称会变
			mXMPPConnection.login(UserConfig.getUserID(), "123", Resourcepart.from("Smack"));
			if(mXMPPConnection.isAuthenticated()){
				AppLog.debug(XmppUtil.class, "loginXMPP---success");
				BroadcastUtil.sendLoginBroadcast(true, false);
				//登录成功,设置用户的vcard信息,这个是为了记录昵称,可以不要
				VCard vCard = new VCard();
				vCard.setNickName(UserConfig.user.getName());
				VCardManager.getInstanceFor(mXMPPConnection).saveVCard(vCard);
				// 获取离线信息
				getOfflineMessage();
				//设置上线
				setPresence(0);//设置在线状态
				// 设置各种监听
				addListener();
			} else {
				AppLog.debug(XmppUtil.class, "loginXMPP----fail");
//				initXMPP();
			}
		} catch (Exception e) {
			AppLog.debug(XmppUtil.class, "XMPP connect--Exception---" + e.getMessage());
//			initXMPP();
		}
	}

	/**
	 * 添加各种监听
	 */
	private static void addListener() {
		//添加xmpp连接监听
		if (checkConnectionListener == null) {
			checkConnectionListener = new CheckConnectionListener();
		}
		mXMPPConnection.addConnectionListener(checkConnectionListener);
		// 添加聊天信息监听
		mChatManager = ChatManager.getInstanceFor(mXMPPConnection);
		if (msgListener == null) {
			msgListener = new MsgListener();
		}
		mChatManager.addIncomingListener(msgListener);
		// 单聊发出监听,估计是对方接收到了才会返回监听,发送是不会返回监听的
//		if (mOutChatListener == null) {
//			mOutChatListener = new OutChatListener();
//		}
//		mChatManager.addOutgoingListener(mOutChatListener);
		//监听邀请加入聊天室请求
		multiUserChatManager = MultiUserChatManager.getInstanceFor(mXMPPConnection);
		if (mucInvitationListener == null) {
			mucInvitationListener = new MucInvitationListener();
		}
		multiUserChatManager.addInvitationListener(mucInvitationListener);
		// 注册好友状态更新监听
		if (friendsPacketListener == null) {
			friendsPacketListener = new FriendsPacketListener();
		}
		StanzaFilter filter = new AndFilter();
		mXMPPConnection.addAsyncStanzaListener(friendsPacketListener, filter);
		// 自定义IQ请求获取群成员时,需要这个监听接收返回数据,请求在requireMatchUser()
		ProviderManager.addIQProvider(TAG_INFO, INFO_NAMESPACE, new ResponseAllMucMemberIQProvider());
		// 默认ping间隔 设为180秒
		mPingManager = PingManager.getInstanceFor(mXMPPConnection);
		mPingManager.setPingInterval(180);
		if (pingServerFailedListener == null) {
			pingServerFailedListener = new PingServerFailedListener();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值