万事都不能从零开始,XMPP规范就象webServece规范一样.我们最后选用一个库来加速开发.
所以我们选择使用Smack因为它容易使用,设计合理,还记得我们的经典jive吗,它也是他们开发
的,应该还是比较不错的. 注意是apache的licence,也就是可以应用到你的商业程序中.
下载地址:
http://www.jivesoftware.org/
使用简单,你不需要精通xmpp协议(这加快我们入门,从例子开始我们跟容易理解),创建一个xmpp
连接,并向一个用户发送信息,只需要三行代码:
XMPPConnection connection = new XMPPConnection("jabber.org");
connection.login("mtucker", "password"); connection.createChat("[email protected]").sendMessage("Howdy!");
因为是tcp协议,首先必须创建一个网络连接:
XMPPConnection 就是用来创建和xmpp服务器的连接的类,如果需要ssl就使用SSLXMPPConnection.
// 创建连接. XMPPConnection conn1 = new XMPPConnection("jabber.org"); // 指定端口 一旦你创建了连接,你需要使用用户名和密码来登陆,你可以使用
操作 名册
名册让你能够跟踪其它在线的用户,用户可以被组织成为组,例如好友,同事,并且你可以发现谁
读写数据包
没一个从客户端发送到xmpp服务器的包都是xml格式的文本.org.jivesoftware.smack.packet 保护了封装
//用presence.Type.UNAVILABLE作为参数创建一个presence描述你不在线. Smack 提供了两种方式来读取包:
PacketListener,和 PacketCollector.
它们都使用PacketFilter实例来决定那些包需要处理.一个PacketListener使用事件风格的编程,packet collector
下面的代码打印出所有Roster实体的信息: Roster roster = con.getRoster(); for (Iterator i=roster.getEntries(); i.hasNext(); ) { System.out.println(i.next()); }
在线状态
每一个用户列表中的对象都有在线状态.Roster.getPresence(String user)返回一个Presence对象描述用户的在线状态. 一个用户的presence要么是在线要么是离线.当一个用户在线时候,它他们的presence还可以包含一些额外的信息,例如当前他们 监听好友名单和Presence的改变 一般的来说都是用一个tree来显好友,例如,你看看下面的图:
presence信息通常都是随时变化的,当然也有可能名单的增加和删除.要监听名单和presence的改变, final Roster roster = con.getRoster(); roster.addRosterListener(new RosterListener() { public void rosterModified() { // Ignore event for this example. } public void presenceChanged(String user) { // If the presence is unavailable then "null" will be printed, // which is fine for this example. System.out.println("Presence changed: " + roster.getPresence(user)); } }); 增加用户到用户列表 用户列表使用的允许模型,也就是只有对方容许你才能把他加入到你的用户名单中.这个保护了用户的 同时如果有一个用户请求把你加入,你必须对这个请求作出接受或反对的回应.Smack提供了三种策略:
Smack提供了一个灵活的框架来处理接受到的数据包:
一个packet listener在事件风格的程序中使用,packet collector可以做轮循和阻塞操作.它们都可以
使用 XMPPConnection 实例来创建. org.jivesoftware.smack.filter.PacketFilter 接口定义了那些包会分发到PacketCollector
// 创建一个包 filter监听特定用户的消息.我们使用AndFilter来联合两个filters.
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class), new FromContainsFilter("[email protected]")); // 假设我们创建了名称为 "connection" XMPPConnection 对象. // 首先使用上面的filter创建PacketCollector对象. PacketCollector myCollector = connection.createPacketCollector(filter); // 接着, 我们创建一个 packet listener. 方便起见我们使用匿名内部类. PacketListener myListener = new PacketListener() { public void processPacket(Packet packet) { // 当包到的时候你做什么. } }; // 注册. connection.addPacketListener(myListener, filter);
标准Packet Filters
我们提供了一系列的filters,你可以实现
PacketFilter 接口来自定义实现.
用Smack编写jabber客户端的基本知识都够了,更多内容请查阅官方资料和mail list请求帮助.
|