现在的位置: 首页 > 综合 > 正文

asmack杂记

2013年11月06日 ⁄ 综合 ⁄ 共 3185字 ⁄ 字号 评论关闭

asmack的代码以及jar可以从 http://code.google.com/p/asmack/downloads/list 下载.

在android中创建一个service用来管理连接以及处理报文.

创建连接代码如下 ,其中server_ip是jabber服务器的ip, 可以是域名.

        Log.i(TAG, "ConnectManager in...");
        ConnectionConfiguration connConfig = new ConnectionConfiguration(server_ip);
        // connConfig.setSecurityMode(SecurityMode.disabled);
        connConfig.setSecurityMode(SecurityMode.required);
        connConfig.setSASLAuthenticationEnabled(false);
        connConfig.setCompressionEnabled(false);
        mConnection = new XMPPConnection(connConfig);

连接到服务器代码:

        if (!isConnect()) {
            Log.i(TAG, "Connect to server now...");
            try {
                // Connect to the server
                mConnection.connect();
                Log.i(TAG, "connect success!!!");
            } catch (XMPPException e) {
                Log.e(TAG, "connect failed!", e);
            }
        }

判断是否连接上:

    mConnection.isConnected();

登录到服务器代码, 需要用户名和密码:

        if (!isLogin()) {
            Log.i(TAG, "Login to server now...");
            try {
                mConnection.login(username, passwd);
                Log.i(TAG, "login success!!!");
            } catch (XMPPException e) {
                Log.e(TAG, "login failed!", e);
            }
        }

判断是否登录上:

     mConnection.isAuthenticated();

添加连接监听代码:

        mConnection.addConnectionListener(new ConnectionListener() {
            public void connectionClosed() {
                // TODO
            }

            public void connectionClosedOnError(Exception e) {
                // TODO
            }

            public void reconnectingIn(int seconds) {
                // Ignore
            }

            public void reconnectionFailed(Exception e) {
                // Ignore
            }

            public void reconnectionSuccessful() {
                // Ignore
            }
        });

添加包监听代码, 以名单列表为例:

      PacketFilter rosterFilter = new PacketTypeFilter(RosterPacket.class);
      mConnection.addPacketListener(new RosterPacketListener(), rosterFilter);

     其中 RosterPacket类是继承Packet类的,  除此之外还有 IQ,  Message,  Presence, AuthMechanism, Response五种类型的包.

可以使用OrFilter来同时处理多种类型的包. 以下代码用来接收所有的包:

        PacketFilter rosterPF = new PacketTypeFilter(RosterPacket.class);
        PacketFilter IQPF = new PacketTypeFilter(IQ.class);
        PacketFilter MSGPF = new PacketTypeFilter(Message.class);
        PacketFilter PresencePF = new PacketTypeFilter(Presence.class);
        PacketFilter AMPF = new PacketTypeFilter(AuthMechanism.class);
        PacketFilter REPF = new PacketTypeFilter(Response.class);
        
        OrFilter allPF = new OrFilter(rosterPF, IQPF);
        allPF.addFilter(MSGPF);
        allPF.addFilter(PresencePF);
        allPF.addFilter(AMPF);
        allPF.addFilter(REPF);
        PacketListener myListener = new PacketListener() {
            public void processPacket(Packet pk) {
                Log.i(TAG, "receive message : " + pk.toString());
            }
        };
        mConnection.addPacketListener(myListener, allPF);

以下是使用asmac过程中遇到的问题以及解决方法:

1)    java.net.SocketException: Bad address family 

解决方法, 在类中加入如下代码:

   static {
        java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
        java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
    }

2) java.security.KeyStoreException: KeyStore jks implementation not found

解决方法, 在创建ConnectionConfiguration 时指定证书位置及类型:

        connConfig.setTruststorePath("/system/etc/security/cacerts.bks");
        connConfig.setTruststoreType("bks");

抱歉!评论已关闭.