Android基于XMPP Smack openfire 开发的聊天室(三) 【新旧记录、踢人】

1,聊天室新旧消息的记录,先看看一段服务器返回的XML吧
[html]  view plain copy print ?
  1. <message  
  2.     from='darkcave@chat.shakespeare.lit/firstwitch'  
  3.     to='hecate@shakespeare.lit/broom'  
  4.     type='groupchat'>  
  5.   <body>Thrice the brinded cat hath mew'd.</body>  
  6.   <delay xmlns='urn:xmpp:delay'  
  7.      from='crone1@shakespeare.lit/desktop'  
  8.      stamp='2002-10-13T23:58:37Z'/>  
  9. </message>  
  10.    
  11. <message  
  12.     from='darkcave@chat.shakespeare.lit/secondwitch'  
  13.     to='hecate@shakespeare.lit/broom'  
  14.     type='groupchat'>  
  15.   <body>Thrice and once the hedge-pig whined.</body>  
  16.   <delay xmlns='urn:xmpp:delay'  
  17.      from='wiccarocks@shakespeare.lit/laptop'  
  18.      stamp='2002-10-13T23:58:43Z'/>  
  19. </message>  
  20.    
  21. <message  
  22.     from='darkcave@chat.shakespeare.lit/thirdwitch'  
  23.     to='hecate@shakespeare.lit/broom'  
  24.     type='groupchat'>  
  25.   <body>Harpier cries 'Tis time, 'tis time.</body>  
  26.   <delay xmlns='urn:xmpp:delay'  
  27.      from='hag66@shakespeare.lit/pda'  
  28.      stamp='2002-10-13T23:58:49Z'/>  
  29. </message>  


上边这段是一个聊天室返回的XML数据,是历史消息。就在这里要告诉大家的是,如果是新消息的话就没有<delay>节点。所以我们以这个为根据来判断。下边贴些我的代码,因为服务器被我们给改了,所以返回的有些出入。但八九不离十。原理一样。

[java]  view plain copy print ?
  1. DelayInformation inf = (DelayInformation) message.getExtension(  
  2.                         "x""jabber:x:delay");  
  3.                 System.out.println("判断消息");  
  4.                 if (inf == null && count >= 1) {  
  5.                     System.out.println("新消息来了");  
  6.                     isHistory = true;  
  7.                 } else {  
  8.                     System.out.println("这是旧的消息");  
  9.                 }  


 

这段代码写哪里呢,就是写在消息的监听里头

[java]  view plain copy print ?
  1. /** 
  2.      * PacketListener 通过一个规定的过滤器提供一个机制来监听数据包 
  3.      *  
  4.      * @author liaonaibo 
  5.      *  
  6.      */  
  7.       
  8.     class ChatPacketListener implements PacketListener   


 

重写它的方法
[java]  view plain copy print ?
  1. @Override  
  2.         public void processPacket(Packet packet)  


 

好了,下边讲踢人吧

2,踢人:

        踢人很简单,只要你是房主,或管理员什么的,主持人也行。这些高权限的才能有踢人的权限。

[java]  view plain copy print ?
  1. // 踢人  
  2.             try {  
  3.                 String nickName = affiliates.get(id);  
  4.                 //得到的昵称包含的房间名和服务名的一段很长数据。好像是吧。哈哈,忘记了。所以截取吧  
  5.                 muc.kickParticipant(nickName  
  6.                         .substring(nickName.indexOf("]") + 1), "看你不爽就 踢了你");  
  7.                 android.os.Message msg = new android.os.Message();  
  8.                 msg.what = MEMBER;  
  9.                 handler.sendMessage(msg);  
  10.                 Toast.makeText(this"哈哈,踹了你", Toast.LENGTH_LONG).show();  
  11.             } catch (XMPPException e) {  
  12.                 e.printStackTrace();  
  13.                 Toast.makeText(this"你没有权利踢人", Toast.LENGTH_LONG).show();  
  14.             }  

有的哥们会疑惑,说如果根据昵称来踢人,那会不会把重名的人都一起踢了。这个问题我也想过,这个也是测试的一个弊端。但是如果通过spark来看,即便你用同样的名字加入了房间,要么会报错,要么就是系统自动在你的名字后边加个2,呵呵,够2吧。如果有人坚持要用自己的昵称,这个可以的,具体怎么样做,下次再阐述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值