文档章节

Smack Overview

墨梅
 墨梅
发布于 2014/04/24 15:26
字数 1719
阅读 96
收藏 1

翻译这个文档的主要原因是为了同Gtalk进行通信,利用Smack来实现自己的机器人等等服务。主要是没有接触其他的Jabber的Java类库,所以没有比较这些类库之间的差别。不过就这一段时间的使用,感觉Smack确实是简单易用! 
现在开始Smack的Tut。如果你也对Smack感兴趣,或对与Gtalk通信感兴趣,你可以留言进行交流,或到我的Google论坛进行交流。 

1:Smack是一个简单的,功能强大的类库。给用户发送信息只需三行代码便可完成 
XMPPConnection connection = new XMPPConnection(”jabber.org“); 
connection.login(”mtucker”, “password”); 
connection.createChat(”jsmith@jivesoftware.com“).sendMessage(”Howdy!”); 
2:不会强迫你向其他类库那样,在信息包层面进行编码。它提供了更加智能化的类比如Chat和Groups,能使你的工作更富效率。 
3:不需要你熟悉XMPP XML格式,甚至是XML格式。 
4:易于实现机-机对话。 
5:Apace License下的开源软件。你可以把它用于你的商业或非商业应用程序。 

关于XMPP 

怎样使用这个文档 
这个文档假定你熟悉XMPP及时消息的主要特征。并热切的希望你能在阅读本文档的时候打开Java Doc API作为参考。 

  • Getting stared with Smack 
    续上 Smack Overview 
    这个文档向你介绍一下Smack API以及它里面的重要类库和观念。 

    建立连接 
    XMPPConection用来同XMPP SERVER建立连接。创建SSL连接的话,需要使用SSLXMPPConection类。下面的代码说明了怎样建立连接 

    // Create a connection to the jabber.org server. 
    XMPPConnection conn1 = new XMPPConnection(”jabber.org”); 

    // Create a connection to the jabber.org server on a specific port. 
    XMPPConnection conn2 = new XMPPConnection(”jabber.org”, 5222); 

    // Create an SSL connection to jabber.org. 
    XMPPConnection connection = new SSLXMPPConnection(”jabber.org”); 

    一旦你建立了连接,你就可以通过XMPPConnection.login(String username, String password)方法,使用你的用户名和密码进行登录。登录成功后,可以创建Chat或GroupChat对象来和其他用户进行交流了。 

    好友列表 
    Roster 类可以用来跟踪每一个用户的状态。你可以把用户归入不同的组比如”Friends”或”Co-worker”,也可以判定用户是否online或 offline。通过XMPPConnection.getRoster()能够获得好友列表,Roster类允许你遍历好友列表,弄清他们是什么名字, 属于那个组,是否在线等等。 

    读写消息包(Reading Or Writing Packet) 
    从客户端发向XMPP SERVER的消息成为包(Packet),通过XML格式发送。org.jivesoftware.smack.packet包包含了这些类,他封装了 XMPP允许的三个不同类型的基本包(message, presence, IQ)。类Chat和GroupChat提供了更高级别的结构,能够自动管理包(Packet)的创建和发送,当然你也能直接创建和发送包 (Packet)。下面的例子说明了如何改变自己的状态,让别人知道你出去钓鱼不在电脑前了。 

    // Create a new presence. Pass in false to indicate we’re unavailable. 
    Presence presence = new Presence(Presence.Type.UNAVAILABLE); 
    presence.setStatus(”Gone fishing”); 
    // Send the packet (assume we have a XMPPConnection instance called “con”). 
    con.sendPacket(presence); 

    Smack提供两种方式来读将要到来的包(Packet): PacketListener和PacketCollector。 两者都使用PacketFilter来决定该处理那种类型的包(Packet).PacketListener常常用在事件驱动的程序中;而 PacketCollector维护一个包(Packet)的结果队列,你可以在其上进行Polling和Blocking操作。当包(Packet)到 来时引发某些事件的时候,使用PacketListener最好不过;而PacketCollector常常用来等待某个特定的包(Packet)。这两 种对象都可以通过XMPPConnection的实例来创建。 

    Messaging using Chat and GroupChat 

    接上 Getting stared with Smack 
    及时通讯的核心是收发信息。Smack提供两个类Chat、GroupChat来完成这项工作。 

    # org.jivesoftware.smack.Chat — 两人交谈 
    # org.jivesoftware.smack.GroupChat — 加入聊天室同多个人进行交谈 
    这两个类都使用org.jivesoftware.smack.packet.Message包类(Packet Class)来收发消息。在某些时候,你可能想不通过这两个类,而是直接收发消息。 

    Chat 
    一个Chat在两个用户之间创造一个新的消息线程。下面的代码段说明了如何进行创建Chat,并发送消息 

    // Assume we’ve created an XMPPConnection name “connection”. 
    Chat newChat = connection.createChat(”jsmith@jivesoftware.com“); 
    newChat.sendMessage(”Howdy!”); 

    Chat.sendMessage(String)方法是一个快捷方法:它首先创建一个Message对象,然后设置消息体,最后发送消息。如果你想在发送消息前增加其他熟悉,你可以使用如下的代码段: 

    // Assume we’ve created an XMPPConnection name “connection”. 
    Chat newChat = connection.createChat(”jsmith@jivesoftware.com“); 
    Message newMessage = newChat.createMessage(); 
    newMessage.setBody(”Howdy!”); 
    message.setProperty(”favoriteColor”, “red”); 
    newChat.sendMessage(newMessage); 

    Chat允许你很容易的侦听对方的回复。下面的代码段是一个应声虫,它回显对方输入的信息 

    // Assume we’ve created an XMPPConnection name “connection”. 
    Chat newChat = connection.createChat(”jsmith@jivesoftware.com“); 
    newMessage.setBody(”Hi, I’m an annoying parrot-bot! Type something back to me.”); 
    while (true) { 
    // Wait for the next message the user types to us. 
    Message message = newChat.nextMessage(); 
    // Send back the same text the other user sent us. 

    newChat.sendMessage(message.getBody()); 

    使用Chat.nextMessage()方法来获取下一个Message,它会无限期的等,直到有下一个消息。还有别的方法可以为新消息指定一段特定的事件,也可以使用事件驱动模式,当消息来时通知你。 
    GroupChat 
    群组聊天允许你连接到聊天室,你可以和组内的人进行通信。在发送和接受消息前,你必须使用一个组名(昵称)来加入某个组。下面的代码段说明了如何加入组并发送消息: 

    // Assume we’ve created an XMPPConnection name “connection”. 
    GroupChat newGroupChat = connection.createGroupChat(”test@jivesoftware.com“); 
    // Join the group chat using the nickname “jsmith”. 
    newGroupChat.join(”jsmith”); 
    // Send a message to all the other people in the chat room. 
    newGroupChat.sendMessage(”Howdy!”); 
    一般来说,在组内收发消息和两人对话类似。并且提供了列出组内其他人的方法。 

  • 使用Java链接Gtalk服务 

    既然想和 Gtalk通信,那么首先怎样才能用Java连上Gtalk呢?而Gtalk采用了基于Jabber的 XMPP协议, 一个开源的即时通信平台,那么他肯定兼容任何一个使用XMPP协议的库。很幸运,Jive SoftWare的Smack就是这样一个简单的而且好用的Jabber 客户端类库。 从Smack2.0后,增加了GoogleTalkConnection,这样你就可以非常简单的连接Gtalk服务器了,不用再设定Host、Port了 。使用下面几行代码就可以连接到Gtalk了: 

    GoogleTalkConnection con = new GoogleTalkConnection(); 
    con.login(”joesmith”, “password”); 
    con.createChat(”maryjane@gmail.com”).sendMessage(”Howdy!”); 
    con.close(); 

    在测试过程�发现应该注意下面的一些问题: 

    login�的用户名是不需要@gmail.com这个后缀的 
    接受方一定要是对方Gtalk的全称。 
    接受方应该在你的好友列表里面,负责对方会收不到任何信息的。 
    很简单,但还是比较有趣的。比如你可以把某个文本�的内容一行行的读出来,然后发送给对方,就像看小说一样。呵呵!

本文转载自:http://www.douban.com/group/topic/3350739/

共有 人打赏支持
墨梅
粉丝 16
博文 218
码字总数 43367
作品 0
杭州
后端工程师
私信 提问
Smack 4.0 正式发布,XMPP 客户端开发包

Smack 4.0 正式发布,该版本进行大量的重构以及底层系统的一些调整,包括使用 Gradle 替代 Ant,使用 Git 替代 SVN 等。同时该版本包含安全方面的更新,建议尽快升级。 升级指南:https://c...

oschina
2014/06/09
3.6K
8
Smack 4.2.4 发布,开源 XMPP 客户端库

Smack 4.2.4 已发布,Smack 是一个开源,易于使用的 XMPP(jabber) 的 Java 客户端类库,Smack 的 patchlevel 版本与 API 兼容。 Bug [SMACK-804] - ServiceAdministrationManager does not ...

周其
04/17
0
0
Smack 4.1.0 发布,XMPP 开发包

Smack 4.1.0 发布,此版本主要修改信息如下: [SMACK-65] - Packet parsing should look for depth [SMACK-237] - Handle more vCard values (XEP-0054) [SMACK-383] - Allow the garbage co......

oschina
2015/03/30
2K
3
Smack 4.1.8 和 4.2.0-beta2 发布

Smack 4.1.8 和 4.2.0-beta2 发布了。Smack是一个开源,易于使用的XMPP(jabber)的 Java 客户端类库。 Smack 4.1.8修复了几个小问题,预计将是4.1分支的最后一个版本。 更新内容: [SMACK-7...

oschina
2016/07/31
913
0
Smack 4.1.6/4.2.0-alpha3 发布

Smack 4.1.6/4.2.0-alpha3 发布,更新如下: 4.1.6 -- 2016-01-23 Bug [SMACK-705] - PubSub's Affiliation.getElementName() returns wrong name [SMACK-706] - Smack may sends and twice......

oschina
2016/01/28
817
0

没有更多内容

加载失败,请刷新页面

加载更多

磁饱和

定义 磁饱和是磁性材料的一种物理特性,指的是导磁材料由于物理结构的限制,所通过的磁通量无法无限增大,从而保持在一定数量的状态。 举例说明 假定有一个电磁铁,通上一个单位电流的时候,...

colinux
4分钟前
0
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
1
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
2
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
1
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部