`
abruzzi
  • 浏览: 454414 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用smack与GTalk通信

阅读更多

前言

前两天无意中发现了smack(火星了,如果你比我还火星,请参看此处:http://www.igniterealtime.org/downloads/index.jsp ),在网上也看到了几个例子,于是想用Swing将其包装一下,做一个简单的gtalk客户端,一来时间有限,而来自己对Swing的熟悉程度不够,代码就不贴出来现眼了,大概说下smack的API,先看下图:


主界面,显示contact list



 与ping.fm机器人聊天,发布twitter消息。


消息发送成功。

Smack是纯JAVA对XMPP(jabber)的一个实现,不但实现了XMPP的标准通信协议,而且提供了好多个扩展,如文件传输等,XMPP是一个扩展性极强的协议,GTalk就是基于XMPP服务的,也就是说,Smack不但可以与GTalk通信,其他所有的XMPP(jabber)服务都是可以的。好了,我们下边具体看下代码:

建立连接

首先当然是建立与gtalk服务器的连接,smack的API封装的非常漂亮,很简洁:

            ConnectionConfiguration conf = new ConnectionConfiguration(
                    "talk.google.com",
                    5222,
                    "gmail.com");
            conf.setSASLAuthenticationEnabled(false);//gtalk不支持SASL验证,设置为false
            XMPPConnection con = new XMPPConnection(conf);
            con.connect();
            /*
             * username : username@gmail.com, @符前边的字符为用户名

             * password :
             */
            con.login("username", "password");

获取好友列表

好友列表在smack中被封装成Roster(花名册)对象,是一个集合对象,其中可以注册监听器,当用户的状态信息发生改变的时候可以通知UI进行更新(比如,在线状态变成离线状态等)

            Roster roster = con.getRoster();

            roster.addRosterListener(new RosterListener(){
                public void entriesAdded(Collection<String> addresses) {}
                public void entriesUpdated(Collection<String> addresses) {}
                public void entriesDeleted(Collection<String> addresses) {}
                public void presenceChanged(Presence presence) {
                    System.out.println(
                            "Presence changed: " + 
                            presence.getFrom() + ":" +
                            presence.getStatus()+":"+
                            presence.getType()+":"+
                            presence.getMode());
                }
            });

可以获取Roster中的每一个实体,来进行某些操作:

            Collection<RosterEntry> entries = roster.getEntries();
            for(RosterEntry entry : entries){
                System.err.println(
                        entry.getName()+":"+
                        entry.getUser()+":"+
                        entry.getType()+":"+
                        entry.getStatus()
                        );//当然,除了打印出信息以外,还可以建立bean对象,来更新list的model。
                System.err.println(
                        "status~"+roster.getPresence(entry.getUser()).getType());
            }

发送/接收消息

首先,从connection上获得ChatManager(聊天管理器),然后用管理器建立与指定用户的Chat session,然后就可以发送,接收消息了。

            ChatManager chatManager = con.getChatManager();
            Chat chat = chatManager.createChat(
                    "kmustlinux@gmail.com",
                new MessageListener(){
                public void processMessage(Chat chat, Message message) {
                    System.err.println("Received Message : "+message.getBody());
                }
            });

 

Chat的构造方法需要提供两个参数

  1. 要与之通信的用户名(这里需要写出该用户的全称,需要加上域名部分)
  2. 一个消息监听器,指定当消息到达时需要做的处理(比如更新接收消息的窗口,发出声音提示等)

通过chat对象,可以发送简单的字符串,也可以将字符串封装成Message对象,并在这个Message对象上加上一些附加属性进行传递。

                    Message message = new Message();
                    message.setBody("message string");
                    message.setProperty("attribute", "value");
                    chat.sendMessage(message);

 

在应用退出之前,需要释放连接

con.disconnect();

 

 

总结

通过例子可以看出,Smack的API相当清晰,而且必要的功能也都提供了。在测试过程中,发现Swing真的很好,API非常好用,可以很好的看出其中的MVC模式的运用,MVC不仅仅是框架级别的,而且细小到每一个控件中,同样适用。有时间了好好完善一下,通过使用XMPP的扩展,可以将其做成一个可用的工具出来,如语音,视频等的支持。

  • 大小: 16.9 KB
  • 大小: 13 KB
  • 大小: 15.4 KB
  • 大小: 43.8 KB
分享到:
评论
3 楼 wll52 2013-12-23  
在应用退出之前,需要释放连接 con.disconnect(); 

这个如何在聊天一会儿之后退出释放。如做一个IM如何做到关闭浏览器后释放。
2 楼 517913840 2012-12-16  
楼主  我现在也在学习这个  roster.add监听 然后public void presenceChanged(Presence presence)这个方法具体怎么操作  总是获取不到好友中竟有谁在线 presnece.isAvalible总是返回false 请指教!
1 楼 smithsun 2009-07-15  
可否将代码发我一份研究下?谢谢!

相关推荐

    ch25_gtalk.rar_android_ch25_gtalk_gtalk_gtalk andro

    1. 消息收发:GTalk客户端使用Smack库作为XMPP的实现,处理与服务器的连接和消息交换。源代码中可以学习到如何构建XML消息结构,以及如何处理各种类型的消息事件。 2. 状态更新与在线状态:GTalk支持用户设置在线、...

    smack4.1.x的完整依赖包

    4. **Smack TCP Transport**: 用于建立与 XMPP 服务器的安全 TCP 连接,支持 TLS/SSL 加密,确保通信安全。 5. **Smack TLS**: 提供了 TLS/SSL 支持,用于加密和验证与服务器的连接。 6. **Smack Provider**: 解析...

    xmpp——Smack的IM实现

    使用Smack,你可以创建`XMPPTCPConnection`实例来建立与XMPP服务器的TCP连接,然后通过`Login`方法进行身份验证。一旦连接建立并登录成功,你可以使用`UserManager`类来查找或创建用户,`Roster`类来管理联系人,...

    WebIM(Openfire+Spark+Smack)

    XMPP不仅用于传统的个人IM应用,如QQ、MSN Messenger和Gtalk(Gtalk是XMPP协议的实现),还可在企业环境中提升沟通效率,甚至在游戏中集成通信功能,增强用户体验。 Spark是一款基于XMPP的Java即时通讯客户端,它...

    openfire+smack开发webim笔记

    【标题】:“openfire+smack开发webim笔记...同时,Smack库简化了Java应用与XMPP服务器的交互。WebIM的实现方式多样化,包括Ajax、Pushlet、Comet等技术,而知名厂商的成功案例则为开发者提供了丰富的实践经验和参考。

    openfire+spark+smack开发流程.pdf

    Instant Messenger,即时通信软件,就是我们日常使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk就是基于XMPP协议的一个实现,而其他的则不是。当前IM几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些...

    java Gtalk机器人

    Java GTalk机器人是一种使用Java编程语言开发的程序,它能够与Google Talk(简称Gtalk)聊天服务进行交互,实现自动化消息发送、接收以及各种自定义功能。Gtalk机器人通常是通过Google的Jabber协议实现的,这是一个...

    openfire+spark+smack开发流程.doc

    IM,即时通讯,如QQ、MSN Messenger和Gtalk,是网络上广泛使用的通信工具,而Gtalk就是基于XMPP协议的实例。 Openfire是XMPP服务器的实现,用Java编写,提供基础的IM服务。它支持用户连接管理、消息路由和群组聊天...

    XMPP基础实现博文整理

    本文将围绕“XMPP基础实现”这一主题,深入探讨使用Smack库来实现XMPP聊天工具的过程及其相关知识点。 一、XMPP协议简介 XMPP起初是为了替代早期的Jabber协议而设计的,它提供了丰富的架构,支持多种实时通信功能,...

    xmppHelloWorld

    根据提供的文件信息,我们可以...通过这些知识点的学习,读者可以了解到如何使用Java和Smack库开发基于XMPP协议的即时通讯应用,特别是针对GTalk的服务。此外,这些知识点也为进一步探索即时通讯领域的开发奠定了基础。

    android asmack 注册 登陆 聊天 多人聊天室 文件传输.pdf

    本文主要讲解在 Android 平台上使用 XMPP 协议实现即时通信,并详细介绍了 openfire、smack 和 spark 三个组件的作用。 一、XMPP 协议简介 XMPP 协议(Extensible Messaging and Presence Protocol)是一种基于 XML...

    简易im gtalk聊天工具源码

    在实际开发过程中,你可能还会遇到一些常见的问题,如网络连接不稳定导致的断线重连、安全性问题(如使用SSL/TLS加密通信)以及性能优化等。对于这些问题,Asmack库通常都有相应的解决方案和最佳实践可供参考。 总...

    Android基于XMPP协议的数据推送技术.pdf

    文档中提到了asmack-jse.jar这个jar包,这是Smack库在Android环境下的一个版本,可以实现与服务器之间的连接和通信。开发人员可以利用这些库来开发XMPP客户端,并实现用户注册、登录、发送接收消息、获取好友状态等...

    Openfire_spark_安装手册

    #### 六、使用Smack开发即时通信功能 - **环境搭建**:确保开发环境中安装了Java SDK,并配置好开发环境。 - **导入Smack库**:将Smack库加入到项目的类路径中。 - **编写代码**:使用Smack API进行用户注册、消息...

    Openfire_spark安装手册.pdf

    - **Smack**: 一个用于实现客户端即时通信功能的Java库,可通过它实现与Openfire的交互。 #### 第二章 安装Openfire 3.6.4 ##### 2.1 配置机器的域名 为了使Openfire能够在网络环境中正常工作,需要为服务器配置...

    目前最详尽的openfire介绍

    总之,Openfire结合XMPP协议、Apache MINA框架以及Spark和Smack等组件,构建了一套完整的即时通信解决方案,不仅支持基本的文本聊天,更具备高度的可扩展性和定制化能力,适用于多种应用场景,包括企业级通信、网络...

    XMPP协议学习资料

    1. 数据传输基于广泛使用的XMPP协议,与其他如QQ、MSN、GTalk等即时通讯服务兼容。 2. 提供了良好的框架支持,简化了开发者实现推送通知的复杂度。 3. 利用MINA框架有效处理高并发连接,提高了系统效率。 4. 采用TLS...

    Openfire_spark_安装手册.pdf

    #### 七、使用Smack开发即时通信功能 1. **集成Smack库**: - 在项目中引入Smack库,通过API实现与Openfire服务器的交互。 - 实现用户注册、登录、消息发送与接收等功能。 2. **扩展功能**: - 探索如何通过...

    openfire综合介绍

    综上所述,通过了解XMPP的基本概念、Spark、Smack与Openfire的功能定位以及Apache MINA在网络通信中的角色,我们可以更好地理解如何构建一个完整且高效的即时通讯系统。同时,Openfire中的命名规则也有助于开发者更...

Global site tag (gtag.js) - Google Analytics