Android基于XMPP Smack openfire 开发的聊天室(一)

来源:互联网 发布:smart电子白板软件安装 编辑:程序博客网 时间:2024/05/17 02:17

聊天smackxmppandroiditeratorjoin

        废话少说,公司没事干,组长叫我写Demo,我狂晕....

        先把先说说这个什么聊天室吧,服务器就别说了,典型的拿来主义。用的是成品的openfire。说道smack,这个是一个jar文件,库,是用在javae的。要想在android端使用这个,就要用到asmack包,这个可以在官网下。其实里边跟smack包没什么区别,具体差异目前我没发现。

        可能有的朋友说这个smack是什么用的,我个人一句话,一个已经包装了XMPP协议的架包。提供了API的操作...好了进入正题

 

1,首先想进入聊天室,那必须要先知道聊天室所在的会议服务(下图,用spark截图)

[java] view plaincopyprint?
  1. /** 
  2.      * 初始化聊服务会议列表 
  3.      */  
  4.     private void initHostRoom() {  
  5.         Collection<HostedRoom> hostrooms;  
  6.         try {  
  7.             hostrooms = MultiUserChat.getHostedRooms(Constants.conn,  
  8.                     Constants.conn.getServiceName());  
  9.             for (HostedRoom entry : hostrooms) {  
  10.                 roominfos.add(entry);  
  11.                 Log.i(TAG, "名字:" + entry.getName() + " - ID:" + entry.getJid());  
  12.             }  
  13.             Log.i(TAG, "服务会议数量:" + roominfos.size());  
  14.         } catch (XMPPException e) {  
  15.             e.printStackTrace();  
  16.         }  
  17.     }  

 

2,获取了那个服务的JID后才能进入会议列表:

[java] view plaincopyprint?
  1. /** 
  2.      * 初始化房间列表 
  3.      */  
  4.     public void init() {  
  5.         listDiscoverItems = new ArrayList<DiscoverItems.Item>();  
  6.         // 获得与XMPPConnection相关的ServiceDiscoveryManager  
  7.         ServiceDiscoveryManager discoManager = ServiceDiscoveryManager  
  8.                 .getInstanceFor(Constants.conn);  
  9.   
  10.         // 获得指定XMPP实体的项目  
  11.         // 这个例子获得与在线目录服务相关的项目  
  12.         DiscoverItems discoItems;  
  13.         try {  
  14.             discoItems = discoManager.discoverItems(jid);  
  15.             // 获得被查询的XMPP实体的要查看的项目  
  16.             Iterator it = discoItems.getItems();  
  17.             // 显示远端XMPP实体的项目  
  18.             while (it.hasNext()) {  
  19.                 DiscoverItems.Item item = (DiscoverItems.Item) it.next();  
  20.                 System.out.println(item.getEntityID());  
  21.                 System.out.println(item.getName());  
  22.                 listDiscoverItems.add(item);  
  23.             }  
  24.         } catch (XMPPException e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  


3,同样,要进入会议房间(聊天室)也要获取它的ID,才能进入

 

[java] view plaincopyprint?
  1. // 后面服务名称必需是创建房间的那个服务  
  2.         jid = getIntent().getStringExtra("jid");  
  3.         try {  
  4.             muc = new MultiUserChat(Constants.conn, jid);  
  5.             // 创建聊天室,进入房间后的nickname(昵称)  
  6.             muc.join("痞子测试");  
  7.             Log.v(TAG, "join success");  
  8.         } catch (XMPPException e) {  
  9.             e.printStackTrace();  
  10.         }