Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3423588
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: 嵌入式

2011-07-25 13:58:41

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""image/jpg"    
  14.                         + encodedImage + ""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 arg0) {    
  8.                         // TODO Auto-generated method stub    
  9.                         System.out.println("--------EE:"+"entriesAdded");    
  10.                     }    
  11.     
  12.                     @Override    
  13.                     public void entriesDeleted(Collection arg0) {    
  14.                         // TODO Auto-generated method stub    
  15.                         System.out.println("--------EE:"+"entriesDeleted");    
  16.                     }    
  17.     
  18.                     @Override    
  19.                     public void entriesUpdated(Collection 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.                 

三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出 一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线文件,检测到对方不存在,先发给系统用户,存到服务器路径,并在数据库中保存信息,当对 方上线时,系统用户查表,拿文件发送

 

想是这么想的,问题是时间太紧,没有实现,囧。

下一篇写离线消息和离线文件

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. }    

晕死,在演示的时候竟然发送文件崩盘了。。。。。实在无语

对了,在发送文件的createOutgoing那边有问题,貌似/Smack,哎,对spark发送就不成功

阅读(2411) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~