openfire/spark/asmack 环境调试纪要

时间:2022-10-08 20:31:44

项目需要简单搭建openfire/spark/asmack的环境及程序demo,本文简单记录以免遗忘。

1、openfire/spark 是java编写的xmpp服务器及PC客户端,安装过程相当简单一直next;需要注意的是openfire中配置的域名,后续会作为客户端接入的地址,可以配置成你的局域网IP。

2、asmack是android下的smack报,即一个XMPP协议栈的客户端版本,记录如下:

  • 应用启动后简历一个xmpp连接
con = new XMPPConnection("192.168.0.28");
con.connect();
  • 客户端首先要注册用户,用户的账号最终要符合XMPP标准,即XX@XXX

注册完成并登陆后会在openfire的管理后台看见该用户信息以及登陆情况。

con.login(account, password);
  • 客户端发送到XMPP服务端的消息被称为packet,根据协议封装为三种:
    • message:最基本的推送消息,不要求响应,用以IM中;
    • presence: 用以表示用户的状态,如在线、离开等;
    • IQ(info/query):一个实体发出请求,要求另外一个实体给出响应;

Packet的接受有同步和异步两种,如下:

// 创建一个packet过滤器来监听来自一个特定用户的新的消息
//我们可以使用一个AndFilter来结合其它两个过滤器。
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class),
new FromContainsFilter("mary@jivesoftware.com"));
// 假设我们已经创建了一个名为"connection"的XMPPConnection。 // 首先,用我们创建的过滤器注册一个packet收集器。
PacketCollector myCollector = connection.createPacketCollector(filter);
// 通常,您应该用收集器来些什么,像等待新的packet。 // 接下来,创建一个packet监听器。我们可以简便地使用匿名内部类。
PacketListener myListener = new PacketListener() {
public void processPacket(Packet packet) {
// 在这里用收到的packet做些什么。
}
};
// 注册这个监听器。
connection.addPacketListener(myListener, filter);
  • Roster 在asmack中代表用户,可以是一个用户,也可以是一个用户组:
List<RosterEntry> entries = new ArrayList<RosterEntry>();
RosterGroup rosgrou = con.getRoster().getGroup(group);
Collection<RosterEntry> roscol = rosgrou.getEntries();
Iterator<RosterEntry> iter = roscol.iterator();
while (iter.hasNext()) {
entries.add(iter.next());
}
return entries;
  • 消息的发送采用chat或者chatgroup,该类是在packet基础上的封装
Chat newChat = connection.createChat("jsmith@jivesoftware.com");
Message newMessage = newChat.createMessage();
newMessage.setBody("Howdy!");
message.setProperty("favoriteColor", "red");
newChat.sendMessage(newMessage);