转载请说明出处:http://blog.csdn.net/steelychen/article/details/37958839
发送文件需要提供准确的接收放用户名称(例:user2@192.168.1.100)、本地文件全路径(例:E:\\xxx\\xxx.zip)
接收文件必须声明一个文件监听器用于监听有可能发送过来的文件。
客户端发送文件代码片断
public void sendFire(XMPPConnection conn,String toUser,String filePath)throws XMPPException{ //conn必须是已经登录了的 //注册toUser只在一个地方登录过,多处登录有可能会出现接收主收不到请求的问题 FileTransferManager ftm = new FileTransferManager(conn); /* * 检查传递的用户是否正确 * toUser="user2@192.168.1.100" * 192.168.1.100 为openfire服务器地址 */ Presence p = connection.getRoster().getPresence(toUser); if(p==null){ System.out.println("用户不存在"); return; } toUser = p.getFrom();//提取完整的用户名称 OutgoingFileTransfer oft = ftm.createOutgoingFileTransfer(toUser); //"get my file"可以是随意字符串,就是一个携带信息 oft.sendFile(new File(filePath), "get my file"); System.out.println("sending file status="+oft.getStatus()); long startTime = -1; while (!oft.isDone()){ if (oft.getStatus().equals(Status.error)){ System.out.println("error!!!"+oft.getError()); }else{ double progress = oft.getProgress(); if(progress>0.0 && startTime==-1){ startTime = System.currentTimeMillis(); } progress*=100; System.out.println("status="+oft.getStatus()); System.out.println("progress="+nf.format(progress)+"%"); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("used "+((System.currentTimeMillis()-startTime)/1000)+" seconds "); }
客户端接收文件代码片断,接收方的测试程序要注意,测试时不能让程序退出,要不然注册的监听器也会随着程序的退出而销毁,当然用户也会被登出。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public void startRecvFileListen(XMPPConnection conn){ //conn必须是已经登录了的 FileTransferManager manager = new FileTransferManager(conn); //添加文件接收监听器 manager.addFileTransferListener(new FileTransferListener() { //每次有文件发送过来都会调用些方法 public void fileTransferRequest(FileTransferRequest request) { //调用request的accetp表示接收文件,也可以调用reject方法拒绝接收 final IncomingFileTransfer inTransfer = request.accept(); try { System.out.println("接收到文件发送请求,文件名称:"+request.getFileName()); //接收到的文件要放在哪里 String filePath = "D:\\datas\\smackclient\\"+request.getFileName(); inTransfer.recieveFile(new File(filePath)); //如果要时时获取文件接收的状态必须在线程中监听,如果在当前线程监听文件状态会导致一下接收为0 new Thread(){ @Override public void run(){ long startTime = System.currentTimeMillis(); while(!inTransfer.isDone()){ if (inTransfer.getStatus().equals(Status.error)){ System.out.println(sdf.format(new Date())+"error!!!"+inTransfer.getError()); }else{ double progress = inTransfer.getProgress(); progress*=100; System.out.println(sdf.format(new Date())+"status="+inTransfer.getStatus()); System.out.println(sdf.format(new Date())+"progress="+nf.format(progress)+"%"); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("used "+((System.currentTimeMillis()-startTime)/1000)+" seconds "); } }.start(); } catch (XMPPException e) { JOptionPane.showMessageDialog(null, "文件失败", "错误", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } }); System.out.println(connection.getUser()+"--"+connection.getServiceName()+"开始监听文件传输"); }
Smack+Openfire 文件接收与发送,布布扣,bubuko.com
原文地址:http://blog.csdn.net/steelychen/article/details/37958839