XMPP——Smack状态,心情,头像更改

  1. 1.       修改自身状态

    包括上线,隐身,对某人隐身,对某人上线

    1. public static void updateStateToAvailable(XMPPConnection connection)    
    2.     {    
    3.         Presence presence = new Presence(Presence.Type.available);    
    4.         connection.sendPacket(presence);    
    5.      }    
    6.         
    7.     public static void updateStateToUnAvailable(XMPPConnection connection)    
    8.     {    
    9.         Presence presence = new Presence(Presence.Type.unavailable);    
    10.         connection.sendPacket(presence);    
    11.         }    
    12.         
    13.     public static void updateStateToUnAvailableToSomeone(XMPPConnection connection,String userName)    
    14.     {    
    15.         Presence presence = new Presence(Presence.Type.unavailable);    
    16.         presence.setTo(userName);    
    17.         connection.sendPacket(presence);    
    18.     }    
    19.     public static void updateStateToAvailableToSomeone(XMPPConnection connection,String userName)    
    20.     {    
    21.         Presence presence = new Presence(Presence.Type.available);    
    22.         presence.setTo(userName);    
    23.         connection.sendPacket(presence);    
    24.     
    25.     }
2.修改心情
  1. /**  
  2.      * 修改心情  
  3.      * @param connection  
  4.      * @param status  
  5.      */    
  6.     public static void changeStateMessage(XMPPConnection connection,String status)    
  7.     {    
  8.         Presence presence = new Presence(Presence.Type.available);    
  9.         presence.setStatus(status);    
  10.         connection.sendPacket(presence);    
  11.         
  12.     }    

3.       修改用户头像

有点麻烦,主要是读入图片文件,编码,传输之

  1. public static void changeImage(XMPPConnection connection,File f) throws XMPPException, IOException    
  2.     {    
  3.         
  4.         VCard vcard = new VCard();    
  5.         vcard.load(connection);    
  6.             
  7.             byte[] bytes;    
  8.               
  9.                 bytes = getFileBytes(f);    
  10.                 String encodedImage = StringUtils.encodeBase64(bytes);    
  11.                 vcard.setAvatar(bytes, encodedImage);    
  12.                 vcard.setEncodedImage(encodedImage);    
  13.                 vcard.setField("PHOTO""<TYPE>image/jpg</TYPE><BINVAL>"    
  14.                         + encodedImage + "</BINVAL>"true);    
  15.                     
  16.                     
  17.                 ByteArrayInputStream bais = new ByteArrayInputStream(    
  18.                         vcard.getAvatar());    
  19.                 Image image = ImageIO.read(bais);    
  20.                 ImageIcon ic = new ImageIcon(image);    
  21.                      
  22.                
  23.               
  24.             vcard.save(connection);    
  25.                
  26.     }    
  27.         
  28.     private static byte[] getFileBytes(File file) throws IOException {    
  29.         BufferedInputStream bis = null;    
  30.         try {    
  31.             bis = new BufferedInputStream(new FileInputStream(file));    
  32.             int bytes = (int) file.length();    
  33.             byte[] buffer = new byte[bytes];    
  34.             int readBytes = bis.read(buffer);    
  35.             if (readBytes != buffer.length) {    
  36.                 throw new IOException("Entire file not read");    
  37.             }    
  38.             return buffer;    
  39.         } finally {    
  40.             if (bis != null) {    
  41.                 bis.close();    
  42.             }    
  43.         }    
  44. }    

4.  补充,用户状态的监听

 

即对方改变头像,状态,心情时,更新自己用户列表,其实这里已经有smack实现的监听器

 

  1. final Roster roster = Client.getRoster();    
  2.             
  3.         roster.addRosterListener(    
  4.                 new RosterListener() {    
  5.     
  6.                     @Override    
  7.                     public void entriesAdded(Collection<String> arg0) {    
  8.                         // TODO Auto-generated method stub    
  9.                         System.out.println("--------EE:"+"entriesAdded");    
  10.                     }    
  11.     
  12.                     @Override    
  13.                     public void entriesDeleted(Collection<String> arg0) {    
  14.                         // TODO Auto-generated method stub    
  15.                         System.out.println("--------EE:"+"entriesDeleted");    
  16.                     }    
  17.     
  18.                     @Override    
  19.                     public void entriesUpdated(Collection<String> arg0) {    
  20.                         // TODO Auto-generated method stub    
  21.                         System.out.println("--------EE:"+"entriesUpdated");    
  22.                     }    
  23.     
  24.                     @Override    
  25.                     public void presenceChanged(Presence arg0) {    
  26.                         // TODO Auto-generated method stub    
  27.                         System.out.println("--------EE:"+"presenceChanged");    
  28.                     }       
  29.                         
  30.                 });    
  31.                 
  32. 离线消息和离线文件

1.       文件的发送

开一个文件选择框,选中文件后再调用下面的方法

  1. public static void sendFile(XMPPConnection connection,    
  2.             String user, File file) throws XMPPException, InterruptedException {    
  3.             
  4.         System.out.println("发送文件开始"+file.getName());    
  5.         FileTransferManager transfer = new FileTransferManager(Client.getConnection());    
  6.         System.out.println("发送文件给: "+user+Client.getServiceNameWithPre());    
  7.         OutgoingFileTransfer out = transfer.createOutgoingFileTransfer(user+Client.getServiceNameWithPre()+"/Smack");//    
  8.             
  9.         out.sendFile(file, file.getName());    
  10.             
  11.         System.out.println("//");    
  12.         System.out.println(out.getStatus());    
  13.         System.out.println(out.getProgress());    
  14.         System.out.println(out.isDone());    
  15.             
  16.         System.out.println("//");    
  17.             
  18.         System.out.println("发送文件结束");    
  19.     }    

2.       文件接收,必须使用监听

  1. FileTransferManager transfer = new FileTransferManager(connection);    
  2. transfer.addFileTransferListener(new RecFileTransferListener());    
  3.     
  4. public class RecFileTransferListener implements FileTransferListener {    
  5.     
  6.     public String getFileType(String fileFullName)    
  7.     {    
  8.         if(fileFullName.contains("."))    
  9.         {    
  10.             return "."+fileFullName.split("//.")[1];    
  11.         }else{    
  12.             return fileFullName;    
  13.         }    
  14.             
  15.     }    
  16.         
  17.     @Override    
  18.     public void fileTransferRequest(FileTransferRequest request) {    
  19.         System.out.println("接收文件开始.....");    
  20.         final IncomingFileTransfer inTransfer = request.accept();    
  21.         final String fileName = request.getFileName();    
  22.         long length = request.getFileSize();     
  23.         final String fromUser = request.getRequestor().split("/")[0];    
  24.         System.out.println("文件大小:"+length + "  "+request.getRequestor());    
  25.         System.out.println(""+request.getMimeType());    
  26.         try {     
  27.                 
  28.             JFileChooser chooser = new JFileChooser();     
  29.             chooser.setCurrentDirectory(new File("."));     
  30.                 
  31.             int result = chooser.showOpenDialog(null);    
  32.                 
  33.             if(result==JFileChooser.APPROVE_OPTION)    
  34.             {    
  35.                 final File file = chooser.getSelectedFile();    
  36.                 System.out.println(file.getAbsolutePath());    
  37.                     new Thread(){    
  38.                         public void run()    
  39.                         {    
  40.                         try {    
  41.     
  42.                             System.out.println("接受文件: " + fileName);    
  43.                             inTransfer    
  44.                                     .recieveFile(new File(file    
  45.                                             .getAbsolutePath()    
  46.                                             + getFileType(fileName)));    
  47.     
  48.                             Message message = new Message();    
  49.                             message.setFrom(fromUser);    
  50.                             message.setProperty("REC_SIGN""SUCCESS");    
  51.                             message.setBody("["+fromUser+"]发送文件: "+fileName+"/r/n"+"存储位置: "+file.getAbsolutePath()+ getFileType(fileName));    
  52.                             if (Client.isChatExist(fromUser)) {    
  53.                                 Client.getChatRoom(fromUser).messageReceiveHandler(    
  54.                                         message);    
  55.                             } else {    
  56.                                 ChatFrameThread cft = new ChatFrameThread(    
  57.                                         fromUser, message);    
  58.                                 cft.start();    
  59.                                     
  60.                             }    
  61.                         } catch (Exception e2) {    
  62.                             e2.printStackTrace();    
  63.                         }    
  64.                         }    
  65.                     }.start();    
  66.             }else{    
  67.                     
  68.                 System.out.println("拒绝接受文件: "+fileName);    
  69.                     
  70.                 request.reject();    
  71.                 Message message = new Message();    
  72.                 message.setFrom(fromUser);    
  73.                 message.setBody("拒绝"+fromUser+"发送文件: "+fileName);    
  74.                 message.setProperty("REC_SIGN""REJECT");    
  75.                 if (Client.isChatExist(fromUser)) {    
  76.                     Client.getChatRoom(fromUser)    
  77.                             .messageReceiveHandler(message);    
  78.                 } else {    
  79.                     ChatFrameThread cft = new ChatFrameThread(    
  80.                             fromUser, message);    
  81.                     cft.start();    
  82.                 }    
  83.             }    
  84.                 
  85.                 
  86.                 
  87.                 
  88.                  
  89.             /* InputStream in = inTransfer.recieveFile();  
  90.                
  91.              String fileName = "r"+inTransfer.getFileName();  
  92.                
  93.              OutputStream out = new FileOutputStream(new File("d:/receive/"+fileName));  
  94.              byte[] b = new byte[512];  
  95.              while(in.read(b) != -1)  
  96.              {  
  97.                  out.write(b);  
  98.                  out.flush();  
  99.              }  
  100.                
  101.              in.close();  
  102.              out.close();*/    
  103.         } catch (Exception e) {    
  104.             e.printStackTrace();    
  105.         }    
  106.             
  107.         System.out.println("接收文件结束.....");    
  108.     
  109.     }    
  110.     
  111. }    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值