首页 > 代码库 > Smack+Openfire 文件接收与发送

Smack+Openfire 文件接收与发送

转载请说明出处: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()+"开始监听文件传输");
}