• Smack+Openfire 接收和发送文件


    转载请注明出处:http://blog.csdn.net/steelychen/article/details/37958839

    发送文件须要提供准确的接收放username称(例:user2@192.168.1.100)、本地文件全路径(例:E:\xxx\xxx.zip)

    接收文件必须声明一个文件监听器用于监听有可能发送过来的文件。

    client发送文件代码片断

    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 为openfireserver地址
    	*/
    	Presence p = connection.getRoster().getPresence(toUser);
    	if(p==null){
    		System.out.println("用户不存在");
    		return;
    	}
    	toUser = p.getFrom();//提取完整的username称
    	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  ");
    }


    client接收文件代码片断。接收方的測试程序要注意,測试时不能让程序退出。要不然注冊的监听器也会随着程序的退出而销毁,当然用户也会被登出。

    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()+"開始监听文件传输");
    }



    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    防止sql注入的小函数 以及一些小验证
    PHP几个防SQL注入攻击自带函数区别
    redis配置文件.conf和常用配置
    redis常用命令
    redis数据类型
    redis的安装和简单操作
    yum CentOS7安装mysql
    Linux安装mysql
    firewall-cmd 常用命令
    解决linux下启动tomcat找不到jdk
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4855024.html
Copyright © 2020-2023  润新知