一个简单的openfire+smack的学习分享

       最近对openfire+smack实现即时聊天功能比较感兴趣,所以稍微的学习了一下。现在smack的最新是4.15,但是网上关于4.x的资料比较少,而且4.x的API变化也比较大,所以对于刚接触的朋友来说,学习起来还是比较不便的。笔者也是刚刚把主要用到的几个类搞清楚(刚刚懂点东西就出来招摇撞骗了!),但是希望本文能对需要的朋友起到一定的帮助。


        我们使用smack实现Android客户端的简单的即时通讯大概会接触到以下几个类:

          1. XMPPTCPConnection(用于与服务器端的连接,和user的登陆)

          2. XMPPTCPConnectionConfiguration(用于配置客户端连接服务器的一些信息)

          3. ConnectionListener(用于监听XMPPTCPConnection的连接状态)

          4. ChatManager (用于接收聊天和发起聊天)

          5. ReconnectionManager (重新连接的管理类)


        接下来我们看看这几个类都是怎么使用的:

          1. XMPPTCPConnection

首先我们看看XMPPTCPConnectionConfiguration的用法,这个类的作用是配置XMPPTCPConnection连接服务器端的一些信息。

    private XMPPTCPConnectionConfiguration getConnectionConfiguratuin() {
        XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
        //设置服务器IP地址
        builder.setHost("192.168.0.1");
        //设置服务器端口号
        builder.setPort(5222);
        //设置服务器名称,与openfire上设置的服务器名对应
        builder.setServiceName("www.hehe.com");
        //开启debug模式
        builder.setDebuggerEnabled(true);
        //启用数据压缩
        builder.setCompressionEnabled(true);
        //连接超时时间
        builder.setConnectTimeout(15 * 1000);
        //是否接受离线消息
        builder.setSendPresence(true);
        //关闭SASL
        builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        //设置登陆设备标识
        builder.setResource("Android");

//        //如果是消息推送 可随机生成用户密码
//        builder.setUsernameAndPassword("username", "password");
//        //设置代理信息
//        ProxyInfo proxyInfo = new ProxyInfo(ProxyInfo.ProxyType.HTTP, "pHost", 8080, "pUser", "pPass");
//        builder.setProxyInfo(proxyInfo)
//        //设置TLS安全协议
//        builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
//        if (Build.VERSION.SDK_INT >= 14) {
//            builder.setKeystoreType("AndroidCAStore");
//        } else {
//            builder.setKeystoreType("BKS");
//            String path = System.getProperty("javax.net.ssl.trustStore");
//            if (path == null) {
//                path = System.getProperty("java.home") + File.separator
//                        + "etc" + File.separator + "security"
//                        + File.separator + "cacerts.bks";
//            }
//            builder.setKeystorePath(path);
//        }

        return builder.build();
    }

          获取到XMPPTCPConnectionConfiguration 我们就可以创建一个XMPPTCPConnection对象了。并且我们可以调用其connect()方法与服务器建立连接,推出应用的时候我应该调用disconnect()与服务器断开连接。

     public void connection() {
        if (mConnection == null) {
            mConnection = new XMPPTCPConnection(getConnectionConfiguratuin());
        }
        //在子线程中进行联网操作
        new Thread() {
            @Override
            public void run() {
                try {
                    //连接到服务器
                    mConnection.connect();
                    //用户登录
                    //mConnection.login("username", "password");
                } catch (SmackException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (XMPPException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

          以上就是XMPPTCPConnection连接服务器的一些基本操作,那么我们如果得知连接服务器的结果呢?一般我们会想到Handler+Thread、接口回调+Thread或者AsyncTask来进行联网操作,这样在客户端成功的连接到服务器的时候就可以通知我们已经成功的连接到服务器。但是Smack库提供了一个ConnnectionListener接口来通知我们联网操作的结果。

 

        mConnection.addConnectionListener(new ConnectionListener() {
            @Override
            public void connected(XMPPConnection connection) {
                //成功的连接到服务器回调的方法
            }

            @Override
            public void authenticated(XMPPConnection connection, boolean resumed) {
                //用户登录认证成功回调的方法
            }

            @Override
            public void connectionClosed() {
                //连接正常关闭回调的方法
            }

            @Override
            public void connectionClosedOnError(Exception e) {
                //连接异常关闭回调的方法
            }

            @Override
            public void reconnectionSuccessful() {
                //重新连接成功回调的方法
            }

            @Override
            public void reconnectingIn(int seconds) {
                //如果没有连接到服务器,每隔seconds秒,进行一次的操作
                //这里我们需要对ReconnectionManager进行设置激活自动重连该方法才会被调用
            }

            @Override
            public void reconnectionFailed(Exception e) {
                //重新失败将会回调的方法
            }
        });
 
 

          这里就涉及到了ReconnectionManager的使用,ReConnectionManager是一个用于管理客户端重新连接的一个管理类,如果想要实现自动重连我们就要对其进行一些配置。

        ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(mConnection);
        //激活自动重连
        reconnectionManager.enableAutomaticReconnection();
        //设置自动重连策略,此策略为重连的操作的频率会根据时间的增加而降低
        reconnectionManager.setReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.RANDOM_INCREASING_DELAY);
        //设置使用设置的FixedDelay来进行重连操作
        //reconnectionManager.setReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.FIXED_DELAY);
        //设置具体的FixedDelay与相应的策略对应使用
        //reconnectionManager.setFixedDelay(15);
        //取消自动重连
        //reconnectionManager.disableAutomaticReconnection();

          以上就是关于XMPPTCPConnection的基本使用,这样我们就可以简单的与服务器进行连接,如果要进行实现简单的聊天功能我们就需要用到ChatManager类。


        2. ChatManager

          ChatManager我们看他的名字就可以大致推断出他是一个管理Chat的类,在Smack中,用户之间的聊天是用个Chat这个类来传递信息的,ChatManager就是一个负责创建和移除Chat的一个管理类。

        //创建ChatManager实例
        ChatManager chatManager = ChatManager.getInstanceFor(mConnection);
        //监听并接收Chat
        chatManager.addChatListener(new ChatManagerListener() {
            @Override
            public void chatCreated(Chat chat, boolean createdLocally) {

            }
        });
        //创建一个Chat
        Chat chat = chatManager.createChat("laowang@xxx.com"); 

          这样我们就可以接受别人发起的Chat或者向指定的用户发起Chat。获得了Chat之后,我们就可以对Chat设置监听来接收消息,或者使用Chat的sendMessage()来发送消息,该方法可以接收一个字符串或者一个Message对象。

        //创建一个Chat
        Chat chat = chatManager.createChat("laowang@xxx.com");
        //监听消息
        chat.addMessageListener(new ChatMessageListener() {
            @Override
            public void processMessage(Chat chat, Message message) {

            }
        });
        //创建一个Message对象,是Smack库里面的
        Message message = new Message();
        message.setBody("hehe");
        try {
            //发送消息
            chat.sendMessage(message);
        } catch (SmackException.NotConnectedException e) {
            e.printStackTrace();
        }

          以上就是Smack中最基本的几个类的使用,其他的类还有AccountManager、MultiUserChatManager等类,可以实现用户注册和多人聊天等功能,总之Smack能够简化IM的开发,是一个非常不错的开源库。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值