`
abruzzi
  • 浏览: 444433 次
  • 性别: 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  
可否将代码发我一份研究下?谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics