前两天无意中发现了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 : [email protected], @符前边的字符为用户名 * 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( "[email protected]", new MessageListener(){ public void processMessage(Chat chat, Message message) { System.err.println("Received Message : "+message.getBody()); } });
Chat的构造方法需要提供两个参数
通过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的扩展,可以将其做成一个可用的工具出来,如语音,视频等的支持。