XMPP——Smack[5]文件传输及离线消息的获取

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

 

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

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

1.       文件的发送

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

public static void sendFile(XMPPConnection connection,  
            String user, File file) throws XMPPException, InterruptedException {  
          
        System.out.println("发送文件开始"+file.getName());  
        FileTransferManager transfer = new FileTransferManager(Client.getConnection());  
        System.out.println("发送文件给: "+user+Client.getServiceNameWithPre());  
        OutgoingFileTransfer out = transfer.createOutgoingFileTransfer(user+Client.getServiceNameWithPre()+"/Smack");//  
          
        out.sendFile(file, file.getName());  
          
        System.out.println("//");  
        System.out.println(out.getStatus());  
        System.out.println(out.getProgress());  
        System.out.println(out.isDone());  
          
        System.out.println("//");  
          
        System.out.println("发送文件结束");  
    }  

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

FileTransferManager transfer = new FileTransferManager(connection);  
transfer.addFileTransferListener(new RecFileTransferListener());  
  
public class RecFileTransferListener implements FileTransferListener {  
  
    public String getFileType(String fileFullName)  
    {  
        if(fileFullName.contains("."))  
        {  
            return "."+fileFullName.split("//.")[1];  
        }else{  
            return fileFullName;  
        }  
          
    }  
      
    @Override  
    public void fileTransferRequest(FileTransferRequest request) {  
        System.out.println("接收文件开始.....");  
        final IncomingFileTransfer inTransfer = request.accept();  
        final String fileName = request.getFileName();  
        long length = request.getFileSize();   
        final String fromUser = request.getRequestor().split("/")[0];  
        System.out.println("文件大小:"+length + "  "+request.getRequestor());  
        System.out.println(""+request.getMimeType());  
        try {   
              
            JFileChooser chooser = new JFileChooser();   
            chooser.setCurrentDirectory(new File("."));   
              
            int result = chooser.showOpenDialog(null);  
              
            if(result==JFileChooser.APPROVE_OPTION)  
            {  
                final File file = chooser.getSelectedFile();  
                System.out.println(file.getAbsolutePath());  
                    new Thread(){  
                        public void run()  
                        {  
                        try {  
  
                            System.out.println("接受文件: " + fileName);  
                            inTransfer  
                                    .recieveFile(new File(file  
                                            .getAbsolutePath()  
                                            + getFileType(fileName)));  
  
                            Message message = new Message();  
                            message.setFrom(fromUser);  
                            message.setProperty("REC_SIGN", "SUCCESS");  
                            message.setBody("["+fromUser+"]发送文件: "+fileName+"/r/n"+"存储位置: "+file.getAbsolutePath()+ getFileType(fileName));  
                            if (Client.isChatExist(fromUser)) {  
                                Client.getChatRoom(fromUser).messageReceiveHandler(  
                                        message);  
                            } else {  
                                ChatFrameThread cft = new ChatFrameThread(  
                                        fromUser, message);  
                                cft.start();  
                                  
                            }  
                        } catch (Exception e2) {  
                            e2.printStackTrace();  
                        }  
                        }  
                    }.start();  
            }else{  
                  
                System.out.println("拒绝接受文件: "+fileName);  
                  
                request.reject();  
                Message message = new Message();  
                message.setFrom(fromUser);  
                message.setBody("拒绝"+fromUser+"发送文件: "+fileName);  
                message.setProperty("REC_SIGN", "REJECT");  
                if (Client.isChatExist(fromUser)) {  
                    Client.getChatRoom(fromUser)  
                            .messageReceiveHandler(message);  
                } else {  
                    ChatFrameThread cft = new ChatFrameThread(  
                            fromUser, message);  
                    cft.start();  
                }  
            }  
              
              
              
              
               
            /* InputStream in = inTransfer.recieveFile(); 
              
             String fileName = "r"+inTransfer.getFileName(); 
              
             OutputStream out = new FileOutputStream(new File("d:/receive/"+fileName)); 
             byte[] b = new byte[512]; 
             while(in.read(b) != -1) 
             { 
                 out.write(b); 
                 out.flush(); 
             } 
              
             in.close(); 
             out.close();*/  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
          
        System.out.println("接收文件结束.....");  
  
    }  
  
}  

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

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

 

短短三天,查资料差得头晕,中文的信息貌似少之又少,哎,匆匆完成,只能算是个半成品,大家自己完善吧。

 

呵呵,下一篇最后一篇了,谢谢离线消息和离线文件吧

http://blog.csdn.net/wklken/article/details/6460126
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值