smack详解xmpp协议的聊天

Smack是一个用于和XMPP服务器通信的类库,由此可以实现即时通讯和聊天。

Smack主要优势

  • 非常简单易用,并且有十分强大的 API。只需三行代码就可以向用户发关文本消息:
    XMPPConnection connection = new XMPPConnection("jabber.org");
    connection.login("mtucker", "password");
    connection.createChat("jsmith@jivesoftware.com").sendMessage("Howdy!");
    
  • 不像其它类库那样强制您进行包级别的编码。Smack提供智能的更高级的构造,像 ChatGroupChat类,让您进行高效的编程。
  • 不需用您熟悉XMPP XML格式,即使您熟悉 XML.
  • 提供简单的设计以进行通讯,Smack允许您在每个消息中设置任意数量的属性,包括java对象。
  • Apache许可下的开源类库,这意味着您可以将Smack整合进您的商业或非商业的应用中
  • Smack的唯一必要条件是JDK 1.2 或更高版本1。smack.jar文件已包含一个XML解析器,不需要其它第三方类库。

    1 JDK 1.2 and 1.3 用户如果想使用SSL连接则classpath在中必须存在JSSE类库。

    建立连接

    XMPPConnection类用来建立到XMPP服务器的连接。要建立SSL连接,要使用SSLXMPPConnection类。下面是建立连接的例子:

    // 建立一个到jabber.org服务器的连接。
    XMPPConnection conn1 = new XMPPConnection("jabber.org");
    
    // 通过一个特殊的端口建立一个到jabber.org服务器的连接。
    XMPPConnection conn2 = new XMPPConnection("jabber.org", 5222);
    
    // 建立一个到jabber.org服务器的SSL连接。
    XMPPConnection connection = new SSLXMPPConnection("jabber.org"); 
    

    一旦您建立了一个连接,您必须通过方法XMPPConnection.login(String username, String password)使用用户名和密码登陆。如果登陆成功,您可以通过创建新的Chat或GroupChat对象和其它用户聊天。

    操作Roster

    Roster能够让您跟踪其它用户的有效性(存在)。您可以通过使用像“朋友”和“同事”这样的组来组织用户,这样您可以发现每个用户是否在线。

    使用XMPPConnection.getRoster()这个方法得到Roster。通过Roster类您可以找到所有Roster登陆、他们所属的组以及每个登陆当前的存在状态。

    读写Packet

    从客户端以XML格式发送到XMPP服务器的每个消息被称为一个“packet”。org.jivesoftware.smack.packet包中包含了一些类,这些类封装了XMPP所允许的三个不同的基本packet类型(message, presence, 和 IQ)。 像Chat和GroupChat这样的类提供了更高类别的构造能够自动地创建和发送packet,但是您也可以直接创建和发送packet。 下面是一个通过改变您的presence来让别人知道您已无效,已经"out fishing"了:

    // 创建一个新的presence. 传入false以指示我们已经无效了
    Presence presence = new Presence(Presence.Type.UNAVAILABLE);
    presence.setStatus("Gone fishing");
    // 发送packet (假设已经有了一个名为"con"的XMPPConnection实例).
    con.sendPacket(presence);
    

    Smack提供两种方法读取收到的packet:PacketListener[packet监听器]PacketCollector[packet收集器]。 二者都是使用PacketFilter实例来决定哪个packet应该被处理。packet监听器用于事件样式的编程,而packet收集器有一个可以做轮询和阻塞操作的packet的结果队列。所以,当您想对一个有可能随时到来的packet采取一些操作时,使用packet监听器;而当您想等待一个特别的packet到来时,使用packet收集器。您可以使用XMPPConnection实例创建packet收集器和监听器。

    往复地发送消息处于即时通讯的核心地位。两个类辅助发送和接收消息:

    • org.jivesoftware.smack.Chat --用于在两个人之间发送消息。
    • org.jivesoftware.smack.GroupChat --用于加入聊天室在多个人之间发送消息。
    Chat和 GroupCha类都是使用 org.jivesoftware.smack.packet.Message packet类来发送消息。在某种特定情况下,您可能不愿意使用高级的Chat和GroupChat类而直接发送和监听消息。

    Chat

    一个chat在两个用户之间创建一个消息线程(通过线程ID)。下面这段代码演示了怎样和用户创建一个新的Chat并向他们发送一条文本消息:
    // 假设我们已经创建了一个名为"connection"的XMPPConnection。
    Chat newChat = connection.createChat("jsmith@jivesoftware.com");
    newChat.sendMessage("Howdy!");
    

    Chat.sendMessage(String)方法可以方便地创建一个Message对象,用字符串参数设置消息正文,然后发送消息。在一定情况下您可能希望在发送消息前设置额外的值,使用Chat.createMessage()Chat.sendMessage(Message)方法,如下面代码片段所示:

    // 假设我们已经创建了一个名为"connection"的XMPPConnection。
    Chat newChat = connection.createChat("jsmith@jivesoftware.com");
    Message newMessage = newChat.createMessage();
    newMessage.setBody("Howdy!");
    message.setProperty("favoriteColor", "red");
    newChat.sendMessage(newMessage);
    

    Chat对象能够让您很容易监听其它聊天参与者的回复。 下面这段代码演示的功能类似鹦鹉学舌--它将回复对方输入的一切消息。

    // 假设我们已经创建了一个名为"connection"的XMPPConnection。
    Chat newChat = connection.createChat("jsmith@jivesoftware.com");
    newMessage.setBody("Hi, I'm an annoying parrot-bot! Type something back to me.");
    while (true) {
        // 等待用户发送给我们的下一条消息。
        Message message = newChat.nextMessage();
        // 将对方发送过来的消息原样发送给他。
        newChat.sendMessage(message.getBody());
    }
    

    以上这段代码使用了这个Chat.nextMessage() 方法得到下一条消息,它将等待不确定何时到来的另一条消息。当然也有其它的方法用于等待特定时间段到来的新消息,或者您可以添加一个监听器,它将在每次有消息到来时通知您。

    GroupChat

    通过GroupChat连接到服务器上的聊天室,您可以在一群人中发送和接收消息。但在您发送或接收消息之前,您必须用一个昵称加入聊天室。下面这段代码演示了连接到一个聊天室并发送一条消息:

    // 假设我们已经创建了一个名为"connection"的XMPPConnection。
    GroupChat newGroupChat = connection.createGroupChat("test@jivesoftware.com");
    // 用昵称"jsmith"加入这处群。
    newGroupChat.join("jsmith");
    // 向聊天室中的其它人发送一条消息。
    newGroupChat.sendMessage("Howdy!");
    

    通常,在群中发送和接收消息和在Chat类中非常相似。同时还提供了用于得到聊天室中其它人的列表的方法。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值