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");














更多相关文章

  1. Webview里JS跳转到Activity页面
  2. Android(安卓)Lifecycle
  3. Android(安卓)4.0后,自定义Title报错 You cannot combine custom
  4. Android(安卓)Studio发布项目到jcenter,一行代码引入Module
  5. 第一行代码-5.4 使用本地广播
  6. android的aidl进程间通讯(二)
  7. android webview js
  8. Android(安卓)蓝牙开发(三)蓝牙Hid 开发
  9. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)

随机推荐

  1. Linux&imx6ull 使用QT开发串口工具(完整版
  2. C++ 第一个demo
  3. IIC学习----概念篇
  4. AD21下载和安装教程
  5. STM32定时器3配置时钟的坑
  6. 提供坚固耐用的笔记本电脑的合作技术
  7. 加班做的报表还被老板嫌弃?是因为你不会用
  8. 视频剪辑必备技能:给小视频增加滚动字幕
  9. Python操作各种数据库
  10. 激动人心!Ceph新长支持稳定版本Luminous(12