首页 > 代码库 > smark和openfire即时通信代码

smark和openfire即时通信代码

出自:http://blog.csdn.net/casuallc/article/details/34794501

服务器:openfire

客户端程序:smark编写

首先安装openfire,下载客户端后直接安装即可,数据库可以用openfire自身的,也可以用自己的数据库,只要按提示设置好参数即可

之后,就可以用smark写一个客户端测试与openfire的通信了(需要引进的jar包除了smark自身的,还要引入xmlpull-1.1.3.1.jar、kxml2-2.3.0.jar两个包

    ,作用是解析xml文件)

备注:我用的smark版本是4.0,要引入的基本包有smack-core-4.0.0.jar、smack-debug-4.0.0.jar、smack-extensions-4.0.0.jar、smack-tcp-4.0.0.jar

debug包使用来调试的,tcp是用来初始化连接的、extension包里面含有发送离线消息、文件等类


下面是创建一个连接

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. ConnectionConfiguration config = new ConnectionConfiguration("ip"5222);  
  2.     //设置成disabled,则不会去验证服务器证书是否有效,默认为enabled  
  3.     config.setSecurityMode(SecurityMode.disabled);  
  4.     //设置可以调试,默认为false,老版本的写法为XMPPConnection.DEBUG_ENABLED = true;  
  5.     config.setDebuggerEnabled(true);  
  6.     //设置是否在登陆的时候告诉服务器,默认为true  
  7.     config.setSendPresence(false);  
  8.     //XMPPConnection在后来的版本中改成了抽象类  
  9.     XMPPConnection conn = new XMPPTCPConnection(config);  
  10.     //设置等待时间  
  11.     conn.setPacketReplyTimeout(5000);  
  12.     conn.connect();  
  13.     //用户名,密码,资源名(例如:如果是用潘迪安发送的消息,则资源名就是:  潘迪安,用于标识客户端)  
  14.     conn.login("admin""0""资源名");  
关于连接的参数,在新版本中全部在config中设置


发送消息

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testSendMessage(XMPPConnection conn) throws Exception {  
  2.         //jid在数据表中ofroster可以查到,一般是   用户名@服务器名称  
  3.         Chat chat = ChatManager.getInstanceFor(conn).createChat("ly@192.168.1.100", new MessageListener() {  
  4.             @Override  
  5.             public void processMessage(Chat chat, Message message) {  
  6.                 System.out.println("Received message: " + message);  
  7.             }  
  8.         });  
  9.         Message msg = new Message();  
  10.         msg.setBody("hello world");  
  11.         //定义成normal,在对象不在线时发送离线消息,消息存放在数据表ofoffline中  
  12.         msg.setType(Message.Type.normal);  
  13.         //发送消息,参数可以是字符串,也可以是message对象  
  14.         chat.sendMessage(msg);  
  15.         //发送广播  
  16.         conn.sendPacket(msg);  
  17.     }  

发送离线消息
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testOffLine(XMPPConnection conn) throws Exception {  
  2.     //离线文件  
  3.     OfflineMessageManager offMM = new OfflineMessageManager(conn);  
  4.     System.out.println("离线文件数量 :" + offMM.getMessageCount());  
  5.     System.out.println("离线文件内容 :");  
  6.     //经测试,当调用getMessages时,会触发chat设置的监听器,从而输出离线消息内容,但是getMessages方法返回的离线消息为空  
  7.     //猜测回调函数的触发条件是一个变量,方变量改变时(while(flag)),执行回调函数  
  8.     List<Message> listMessage = offMM.getMessages();  
  9.     //listMessage的大小为0  
  10.     System.out.println(listMessage.size());  
  11.     for(Message m : offMM.getMessages()) {  
  12.         System.out.println(" 离线  : " + m.getBody() + m.getBodies());  
  13.     }  
  14. }  

得到好友列表
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testGetRoster(XMPPConnection conn) throws Exception {  
  2.     //得到该user的roster(相当于好友列表),不区分是否在线  
  3.     Roster r = conn.getRoster();  
  4.     Collection<RosterEntry> c = r.getEntries();  
  5.     for(RosterEntry re : c) {  
  6.         StringBuilder sb = new StringBuilder();  
  7.         sb.append("name : ").append(re.getName());  
  8.         sb.append("\nuser : ").append(re.getUser());  
  9.         sb.append("\ntype : ").append(re.getType());  
  10.         sb.append("\nstatus : ").append(re.getStatus());  
  11.         System.out.println(sb.toString());  
  12.         System.out.println("-----------------------------");  
  13.     }  
  14.     System.out.println(r.getEntries());  
  15.     //输出内容  
  16.     /*  name : null 
  17.         user : ly@192.168.1.100 
  18.         type : from 
  19.         status : null 
  20.         ----------------------------- 
  21.         name : null 
  22.         user : yy@192.168.1.100 
  23.         type : to 
  24.         status : null 
  25.         ----------------------------- 
  26.         [ly@192.168.1.100, yy@192.168.1.100] 
  27.      */  
  28. }  

管理好友,监听好友请求
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <pre name="code" class="java">  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. </pre><pre name="code" class="java">private void testAddAndDelFriends(final XMPPConnection conn) throws Exception {  
  2.         Roster r = conn.getRoster();  
  3.         // 用户的jid,昵称,用户的分组。如果该用户不存在也可以添加  
  4.     //  r.createEntry("yy@192.168.1.100", "yy", null);  
  5.         // rosterEntry的构造方法是包访问权限,不能直接new  
  6.     //  RosterEntry entry = r.getEntry("ly@192.168.1.100");  
  7.         // r.removeEntry(entry);  
  8.           
  9.         //监听所有的请求,之后可以过滤掉不想要的请求  
  10.         PacketListener packetListener = new PacketListener() {  
  11.               
  12.             @Override  
  13.             public void processPacket(Packet packet) throws NotConnectedException {  
  14.                 /* 
  15.                 available   
  16.                 unavailable  
  17.                 subscribe  发出添加好友的请求 
  18.                 subscribed 同意添加好友 
  19.                 unsubscribe 发出删除好友请求 
  20.                 unsubscribed 删除好友(即拒绝添加好友), 
  21.                               备注:对方发出添加好友的请求后,在服务器端会自动把对方加入到自己的roster,所以在执行处理好友请求或添加删除好友的时候,要重新获取roster,更新好友列表 
  22.                 */  
  23.                 Presence presence = (Presence) packet;  
  24.                 Type type = presence.getType();  
  25.                 //请求添加好友  
  26.                 if(Type.subscribe.equals(type)) {  
  27.                     //注意点:要设置to(即指明要发送的对象,否则不能成功拒绝),至于from不用设置,因为在sendPacket方法中已经设置了,formMode初始化的时候为OMITTED,可以自己设置  
  28.                     /* 
  29.                         switch (fromMode) { 
  30.                         case OMITTED: 
  31.                             packet.setFrom(null); 
  32.                             break; 
  33.                         case USER: 
  34.                             packet.setFrom(getUser());//getUser是抽象方法 
  35.                             break; 
  36.                      */  
  37.                     //直接用传来的presence,不能自己新建一个presence(可能要验证presence是否是原来的对象,来判断是谁拒绝了谁的好友请求),否则不能成功拒绝对方添加好友  
  38.                     //例:A--presence1-->B   A---presence2---C, C---presence3---A这样服务器就没办法判断是B、C中的哪一个拒绝了A的请求  
  39.                     presence.setType(Type.unsubscribed);//拒绝,发送了一条presence  
  40.                     //presence.setType(Type.unavailable);//发送了两条presence,一条是subscribed,一条是unavailabled,能接受对方消息,自己的状态显示隐身,再一次登录的时候显示在线  
  41.                     presence.setTo(presence.getFrom());  
  42.                     presence.setPacketID(presence.getPacketID());  
  43.                     Roster r = conn.getRoster();  
  44.                     try {  
  45.                         RosterEntry entry = r.getEntry(presence.getFrom());  
  46.                         if(entry != null)  
  47.                             r.removeEntry(entry);  
  48.                     } catch (NotLoggedInException | NoResponseException | XMPPErrorException e) {  
  49.                         // TODO Auto-generated catch block  
  50.                         e.printStackTrace();  
  51.                     }  
  52.                     conn.sendPacket(presence);  
  53.                     //多方删除自己  
  54.                 } else if(Type.unsubscribe.equals(type)) {  
  55.                     presence.setTo(presence.getFrom());  
  56.                     presence.setType(Type.unsubscribe);  
  57.                     Roster r = conn.getRoster();  
  58.                     try {  
  59.                         r.removeEntry(r.getEntry(presence.getFrom()));  
  60.                     } catch (NotLoggedInException | NoResponseException | XMPPErrorException e) {  
  61.                         // TODO Auto-generated catch block  
  62.                         e.printStackTrace();  
  63.                     }  
  64.                     conn.sendPacket(presence);  
  65.                 }   
  66.             }  
  67.         };  
  68.           
  69. //      PacketFilter packetFilter = new PacketFilter() {  
  70. //            
  71. //          //如果返回false,则不把事件交给listener处理,否则会调用packetListener中的processPacket方法  
  72. //          //方法解释true if and only if packet passes the filter.  
  73. //          @Override  
  74. //          public boolean accept(Packet packet) {  
  75. //              System.out.println("2" + packet);  
  76. //              return true;  
  77. //          }  
  78. //      };   
  79.           
  80.         //过滤掉所有的不是好友请求、删除的所有packet  
  81.         PacketFilter packetFilter = new AndFilter(new PacketTypeFilter(Presence.class));  
  82.           
  83.         conn.addPacketListener(packetListener, packetFilter);  
  84.           
  85.           
  86.         //未知  
  87.         RosterExchangeManager rem = new RosterExchangeManager(conn);  
  88.         rem.addRosterListener(new RosterExchangeListener() {  
  89.   
  90.             @Override  
  91.             public void entriesReceived(String from, Iterator<RemoteRosterEntry> remoteRosterEntries) {  
  92.                 System.out.println(from);  
  93.                 while(remoteRosterEntries.hasNext()) {  
  94.                     RemoteRosterEntry entry = remoteRosterEntries.next();  
  95.                     System.out.println(entry.getUser() + " : " + entry.getName());  
  96.                 }  
  97.             }  
  98.               
  99.         });  
  100.     }  


得到好友的信息,主要是VCard类的使用
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testGetFriendInfo(XMPPConnection conn) throws Exception {  
  2.         VCard vCard = new VCard();  
  3.         VCardManager vcManager = new VCardManager();  
  4.         //此处返回false  
  5.         boolean b = vcManager.isSupported("ly@192.168.1.100", conn);  
  6.         System.out.println(b);  
  7.         vCard.load(conn, "ly@192.168.1.100");  
  8.          // Load Avatar from VCard  
  9.          byte[] avatarBytes = vCard.getAvatar();  
  10.          //得不到头像等的信息  
  11.          if(avatarBytes == null) {  
  12.              return;  
  13.          }  
  14.            
  15.          // To create an ImageIcon for Swing applications  
  16.          ImageIcon icon = new ImageIcon(avatarBytes);  
  17.          System.out.println(icon.getIconWidth() + " : " + icon.getIconHeight());  
  18.            
  19.          // To create just an image object from the bytes  
  20.          ByteArrayInputStream bais = new ByteArrayInputStream(avatarBytes);  
  21.          try {  
  22.            Image image = ImageIO.read(bais);  
  23.            FileOutputStream fos = new FileOutputStream("D://icon.jpg");  
  24.            fos.write(avatarBytes);  
  25.            fos.close();  
  26.           }  
  27.           catch (IOException e) {  
  28.             e.printStackTrace();  
  29.          }  
  30.     }  

设置自己的状态信息
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testSetInfo(XMPPConnection conn) throws Exception {  
  2.     VCard vCard = new VCard();  
  3.     vCard.load(conn);  
  4.     vCard.setEmailHome("admin@126.com");  
  5.     vCard.setAddressFieldWork("POSTAL""汇宝大厦");  
  6.     //修改完要保存修改的内容,否则没办法更新到服务器  
  7.     vCard.save(conn);  
  8.     //修改自身的状态,包括隐身,上线(可以指定对特定的好友更改状态)  
  9.     Presence p = new Presence(Type.available);  
  10.     p.setTo("ly@192.168.1.100");  
  11.     //修改心情  
  12.     p.setStatus("我的心情");  
  13.     //同样要发到服务器  
  14.     conn.sendPacket(p);  
  15. }  

监听好友的状态
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testSetRosterListener(XMPPConnection conn) throws Exception {  
  2.         Roster r = conn.getRoster();  
  3.         r.createEntry("ly@192.168.1.100""昵称"null);  
  4.         r.addRosterListener(new RosterListener() {  
  5.               
  6.             @Override  
  7.             public void presenceChanged(Presence presence) {  
  8.                 //更改状态信息时调用该方法(更改在线状态,修改心情,修改头像等)  
  9.                 System.out.println("presenceChanged");  
  10.             }  
  11.               
  12.             @Override  
  13.             public void entriesUpdated(Collection<String> addresses) {  
  14.                 //该方法以及下面的方法都是在服务器修改好友信息时触发  
  15.                 System.out.println("entriesUpdated");  
  16.             }  
  17.               
  18.             @Override  
  19.             public void entriesDeleted(Collection<String> addresses) {  
  20.                 // TODO Auto-generated method stub  
  21.                 System.out.println("entriesDeleted");  
  22.             }  
  23.               
  24.             @Override  
  25.             public void entriesAdded(Collection<String> addresses) {  
  26.                 // TODO Auto-generated method stub  
  27.                 System.out.println("entriesAdded");  
  28.             }  
  29.         });  
  30.     }  

监听好友的输入状态
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testGetExtention(XMPPConnection conn) throws Exception {  
  2.         Chat chat = ChatManager.getInstanceFor(conn).createChat("ly@192.168.1.100"new MessageListener() {  
  3.               
  4.             @Override  
  5.             public void processMessage(Chat chat, Message message) {  
  6.                 //得到输入状态,分为五种:正在输入(composing),暂停输入(paused),发送(active),关闭对话框(gone)  
  7.                 PacketExtension pe = message.getExtension("http://jabber.org/protocol/chatstates");  
  8.                 switch (pe.getElementName()) {  
  9.                 case "composing":  
  10.                     System.out.println("正在输入......");  
  11.                     break;  
  12.                 case "paused":  
  13.                     System.out.println("正在冥想......");  
  14.                     break;  
  15.                 case "active":  
  16.                     System.out.println("对方已发送。");  
  17.                     break;  
  18.                 case "gone":  
  19.                     System.out.println("对话框已被关闭。");  
  20.                     break;  
  21.                 default:  
  22.                     break;  
  23.                 }  
  24.             }  
  25.         });  
  26.         Message msg = new Message();  
  27.         msg.addExtension(new ChatStateExtension(ChatState.gone));  
  28.         msg.setBody("hello world");  
  29.         chat.sendMessage(msg);  
  30.     }  

加入聊天室进行多人聊天
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private MultiUserChat multiUserChat;  
  2.     private void testMutiUserChat(XMPPConnection conn) throws Exception {  
  3.         MultiUserChat.addInvitationListener(conn, new InvitationListener() {  
  4.               
  5.             @Override  
  6.             public void invitationReceived(XMPPConnection conn, String room, String inviter, String reason, String password, Message message) {  
  7.                 StringBuilder sb = new StringBuilder();  
  8.                 sb.append("房间号  : ").append(room);  
  9.                 sb.append("\n邀请者  : ").append(inviter);  
  10.                 sb.append("\n理由  : ").append(reason);  
  11.                 sb.append("\n密码  : ").append(password);  
  12.                 sb.append("\n消息  : ").append(message);  
  13.                 System.out.println(sb);  
  14.                 multiUserChat = new MultiUserChat(conn, room);  
  15.                 try {  
  16.                     multiUserChat.join("admin", password);  
  17.                 } catch (XMPPErrorException e) {  
  18.                     // TODO Auto-generated catch block  
  19.                     e.printStackTrace();  
  20.                 } catch (SmackException e) {  
  21.                     // TODO Auto-generated catch block  
  22.                     e.printStackTrace();  
  23.                 }  
  24.                 multiUserChat.addMessageListener(new PacketListener() {  
  25.                       
  26.                     @Override  
  27.                     public void processPacket(Packet packet) throws NotConnectedException {  
  28.                         Message msg = (Message) packet;  
  29.                         System.out.println(msg.getBody());  
  30.                     }  
  31.                 });  
  32.             }  
  33.         });  
  34.         while(true) {  
  35.             try {  
  36.                 Thread.sleep(500);  
  37.                 if(multiUserChat == null)  
  38.                     continue;  
  39.                 //关于发送消息的问题,可以直接发字符串  
  40.                 //也可以发送message,但是要设定message的一些参数,否则不能发送(参数设置如下)  
  41.                 //用Chat发送消息时,不用设置,原因是在Chat的sendMessage方法中已经添加了这些参数  
  42.                 /* 
  43.                  *  message.setTo(participant); 
  44.                     message.setType(Message.Type.chat); 
  45.                     message.setThread(threadID); 
  46.                  */  
  47.                 //但是,用MultiUserChat类中的sendMessage方法,直接调用了XMPPConnection中的sendPacket方法,没有设置Message的参数  
  48.                 Message msg = new Message();  
  49.                 //房间名称  
  50.                 msg.setTo("a@conference.192.168.1.100");  
  51.                 msg.setType(Message.Type.groupchat);  
  52.                 msg.setThread(Thread.currentThread().getId() + "");  
  53.                 msg.setBody("hello");  
  54.                 multiUserChat.sendMessage(msg);  
  55.                 break;  
  56.             } catch (InterruptedException e) {  
  57.                 e.printStackTrace();  
  58.             } catch (NotConnectedException e) {  
  59.                 e.printStackTrace();  
  60.             } catch (XMPPException e) {  
  61.                 e.printStackTrace();  
  62.             }  
  63.         }  
  64.     }  
  65.       

发送和接收文件

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testSendFile(XMPPConnection conn) throws Exception {  
  2.         // 发送文件的管理器  
  3.         FileTransferManager ftm = new FileTransferManager(conn);  
  4.         ftm.addFileTransferListener(new FileTransferListener() {  
  5.   
  6.             @Override  
  7.             public void fileTransferRequest(FileTransferRequest request) {  
  8.                 System.out.println(request.getFileName());  
  9.                 IncomingFileTransfer inComingFileTransfer = request.accept();  
  10.                 try {  
  11.                     //可以直接写到file文件中  
  12.                     File file = new File("D://" + request.getFileName());  
  13.                     inComingFileTransfer.recieveFile(file);  
  14.                 } catch (Exception e) {  
  15.                     e.printStackTrace();  
  16.                 }  
  17.             }  
  18.         });  
  19.         // 注意jid格式,下面为标准格式,如果不对则会抛出jid格式错误的异常  
  20.         // (if (parseName(jid).length() <= 0 || parseServer(jid).length() <= 0|| parseResource(jid).length() <= 0) {  
  21.         // return false;  
  22.         OutgoingFileTransfer oft = ftm.createOutgoingFileTransfer("admin@192.168.1.100/潘迪安");  
  23.         File file = new File("D://time.jpg");  
  24.         oft.sendFile(file, "图片");  
  25.         System.out.println(oft.isDone());  
  26.     }  
创建多人聊天室
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1.     private void testCreateRoom(XMPPConnection conn) throws Exception {  
  2.         while(true) {  
  3.             if(conn != null)  
  4.                 break;  
  5.         }  
  6.         //@之前的是会议房间名称,之后的是conference+ip(固定格式,不能改变)  
  7.         MultiUserChat muc = new MultiUserChat(conn, "ly@conference.192.168.1.100");  
  8.         //昵称,如果该房间已经存在,则会抛出Creation failed - Missing acknowledge of room creation.(先加入房间,然后离开房间)  
  9.         muc.create("real_admin");  
  10.         Form form = muc.getConfigurationForm();  
  11.         Form submitForm = form.createAnswerForm();  
  12.         //下面的初始化有什么用,在创建submitForm的时候已经设置参数了  
  13. //      List<FormField> list = submitForm.getFields();  
  14. //      for(FormField f : list) {  
  15. //          if(!(FormField.TYPE_HIDDEN.equals(f.getType())) && f.getVariable() != null) {  
  16. //              submitForm.setDefaultAnswer(f.getVariable());  
  17. //          }  
  18. //      }  
  19.         //参数到底是什么意思,为什么有的可以设置,有的不可以设置  
  20.         /* 
  21.          *  variable:FORM_TYPE  type:hidden  value:[http://jabber.org/protocol/muc#roomconfig] 
  22.             variable:muc#roomconfig_roomname  type:text-single  value:[] 
  23.             variable:muc#roomconfig_roomdesc  type:text-single  value:[] 
  24.             variable:muc#roomconfig_changesubject  type:boolean  value:[] 
  25.             variable:muc#roomconfig_maxusers  type:list-single  value:[] 
  26.             variable:muc#roomconfig_presencebroadcast  type:list-multi  value:[] 
  27.             variable:muc#roomconfig_publicroom  type:boolean  value:[] 
  28.             variable:muc#roomconfig_persistentroom  type:boolean  value:[] 
  29.             variable:muc#roomconfig_moderatedroom  type:boolean  value:[] 
  30.             variable:muc#roomconfig_membersonly  type:boolean  value:[] 
  31.             variable:muc#roomconfig_allowinvites  type:boolean  value:[] 
  32.             variable:muc#roomconfig_passwordprotectedroom  type:boolean  value:[] 
  33.             variable:muc#roomconfig_roomsecret  type:text-private  value:[] 
  34.             variable:muc#roomconfig_whois  type:list-single  value:[] 
  35.             variable:muc#roomconfig_enablelogging  type:boolean  value:[] 
  36.             variable:x-muc#roomconfig_reservednick  type:boolean  value:[] 
  37.             variable:x-muc#roomconfig_canchangenick  type:boolean  value:[] 
  38.             variable:x-muc#roomconfig_registration  type:boolean  value:[] 
  39.             variable:muc#roomconfig_roomadmins  type:jid-multi  value:[] 
  40.             variable:muc#roomconfig_roomowners  type:jid-multi  value:[] 
  41.          */  
  42.         //submitForm.setAnswer(FormField.TYPE_TEXT_PRIVATE, "0");  
  43.         muc.sendConfigurationForm(submitForm);  
  44.         //被拒绝时执行  
  45.         muc.addInvitationRejectionListener(new InvitationRejectionListener() {  
  46.               
  47.             @Override  
  48.             public void invitationDeclined(String invitee, String reason) {  
  49.                 System.out.println(invitee + " : " + reason);  
  50.             }  
  51.         });  
  52.         muc.invite("yy@192.168.1.100""ly_room");  
  53.     }  

管理房间
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <pre name="code" class="java">private void testManageRoom(XMPPConnection conn) throws Exception {  
  2.         testCreateRoom(conn);  
  3.         MultiUserChat muc = new MultiUserChat(conn, "ly@conference.192.168.1.100");  
  4.         //Thread.sleep(5000);  
  5.         //赋予管理员权限  
  6.         //muc.grantAdmin("yy@192.168.1.100");  
  7.           
  8.           
  9.         //Thread.sleep(5000);  
  10.         //如果是管理员,则不能踢除  
  11.         //muc.banUser("yy@192.168.1.100", "太水");  
  12.           
  13.         //收回说话的权限  
  14.         muc.revokeVoice("yy");  
  15.         //muc.grantVoice("yy");  
  16.     }  

注册

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testRegister(XMPPConnection conn) throws Exception {  
  2.         //可以直接改登陆用户的信息(如果是username的值必须和该用户的用户名相同)  
  3.         Registration r = new Registration();  
  4.         Map<String, String> attributes = new HashMap<String, String>();  
  5.         attributes.put("username""newuser");  
  6.         attributes.put("password""0");  
  7.         attributes.put("email""new00@126.com");  
  8.         attributes.put("name""name@192.168.1.100");  
  9.         //添加用户,要设置type类型为set,原因不明  
  10.         r.setType(IQ.Type.SET);  
  11.         r.setAttributes(attributes);  
  12.         //过滤器,用来过滤由服务器返回的信息(即得到注册信息的内容)  
  13.         PacketFilter packetFilter = new AndFilter(new PacketIDFilter(r.getPacketID()), new PacketTypeFilter(IQ.class));  
  14.         PacketCollector collector = conn.createPacketCollector(packetFilter);   
  15.         System.out.println(r);  
  16.         conn.sendPacket(r);  
  17.         IQ result = (IQ) collector.nextResult();  
  18.         if(result == null) {  
  19.             System.out.println("服务器没有返回任何信息");  
  20.         } else {  
  21.         switch (result.getType().toString()) {  
  22.             case "result":  
  23.                 System.out.println("注册成功");  
  24.                 break;  
  25.             case "error":  
  26.                 if(result.getError().toString().equalsIgnoreCase("conflict"))  
  27.                     System.out.println("用户名称已存在");  
  28.                 else   
  29.                     System.out.println("注册失败");  
  30.                 break;  
  31.             default:  
  32.                 break;  
  33.             }  
  34.         }  
  35.     }  

管理账号密码

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testModifyPwd(XMPPConnection conn) throws Exception {  
  2.         //创建一个用户信息管理,可以创建新用户,或者修改用户密码  
  3.         AccountManager am = AccountManager.getInstance(conn);  
  4.         Collection<String> c = am.getAccountAttributes();  
  5.         for(String s : c) {  
  6.             System.out.println(s);  
  7.         }  
  8.         /* 
  9.          * 通过accountManager可以得到的属性 
  10.          *  username 
  11.             email 
  12.             registered 
  13.             name 
  14.             password 
  15.          */  
  16.         am.getAccountAttribute("username");  
  17.         am.createAccount("newUser""0");  
  18.         am.changePassword("00");  
  19.     }  


至于细节和中间遇到的问题,在程序代码中都有叙述


参考博客:

http://blog.csdn.net/shimiso/article/details/11225873

smark和openfire即时通信代码