注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

liangxh2008的博客

 
 
 

日志

 
 

Java文件夹复制(远程复制(网络传输),用于远程备份文件)(支持文件夹,嵌套子文件夹)  

2010-05-20 17:20:20|  分类: pc sync |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.csdn.net/homepagexinxin/archive/2009/05/19/4201387.aspx


Client端

--------------------------------

FileSelection.java

package com.xinxin.Client;
/*
 * 本程序用于实现文件夹的复制
 * 作者: 金鑫鑫
 * 完成日期:2009/5/19
 * 版本号:1.0
 * 测试说明:在Eclipse工程目录下面新建一个Test文件夹,
 * 然后在里面放入任何你想放入的文件或者目录,可以有多层
 * 目录.运行程序,可以看到在工程目录下面出现了一个Backup
 * 文件夹,看一下是否和Test文件夹中内容相同.
 * 联系方式:xinxinli1234@sina.com
 * 版权说明:没有任何版权,可以任意修改
 * 最后:本程序没有界面,可以自己修改文件的主目录和备份目录.
 */
import java.io.*;
import java.util.*;

public class FileSelection {
 private File rootDirectory;//根目录
 private File[] fileList;//文件目录下面的文件列表(包括目录,用于多次判断)
 private ArrayList<File> fileArrayList; // 用于存储文件(只是文件)列表
 //初始化参数
 public FileSelection() {
  fileArrayList=new ArrayList<File>();
  rootDirectory = new File("Test");
  rootDirectory.mkdir();
 }
 //获得文件(不包括目录)的列表
 public void initFileArrayList() {
  
  if (rootDirectory.isDirectory()) {
   //遍历目录下面的文件和子目录
   fileList = rootDirectory.listFiles();
   for (int i = 0; i < fileList.length; i++) {
    //如果是文件,添加到文件列表中
    if(fileList[i].isFile()){
     fileArrayList.add(fileList[i]);
    }
    //否则递归遍历子目录
    else if (fileList[i].isDirectory()) {
       fileList[i].mkdir();
       rootDirectory=fileList[i];
       initFileArrayList();
    }
    
   }
  }
 }
 //将文件信息添加到列表中
 public void addFiles(File f){
  fileArrayList.add(f);
 }
 //访问器返回文件列表
 public ArrayList<File> getFileArrayList() {
  return fileArrayList;
 }
 
}
--------------------

BackupClient.java

package com.xinxin.Client;
import java.io.*;
import java.net.*;
/**
 *
 * @author Administrator
 *@version 1.0
 *BackupClient类实现文件的传输到服务器
 */
public class BackupClient  implements Runnable{
 private int port;//服务器端口
 private InetAddress ipAddress;//服务器IP地址
 private Socket clientSocket;//客户端套接字
 private InputStream inputStream;//网络输入流
 private OutputStream outputStream;//网络输出流
 
 private File file;
 
 //构造函数(获得服务器端IP地址和监听端口号)
 public BackupClient(InetAddress ipAddress,int port,File file){
  this.ipAddress=ipAddress;
  this.port=port;
  this.file=file;
 }
 //向服务器端发送文件
 public void run(){
  try{
   String fileName="";//文件名称
   long fileLength=0;//文件长度
   fileName=file.getPath();
   fileLength=file.length();
   
   //连接服务器,获得网络输入输出流
   clientSocket=new Socket(ipAddress,port);
   inputStream=clientSocket.getInputStream();
   outputStream=clientSocket.getOutputStream();
   
    System.out.print("客户端正在发送文件 "+fileName+"\n请等待: ");
   
   //获得本地的文件输入流(此处使用BufferedInputStream大大地提高速度)
   DataInputStream di=new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
   //获得网络输出流(此处使用BufferedOutputStream大大地提高速度)
    DataOutputStream ds=new DataOutputStream(new BufferedOutputStream(outputStream));
    //发送文件名和长度
    ds.writeUTF(fileName);
    ds.writeLong(fileLength);
    ds.flush();
    //发送文件内容
   int first;
   long j=fileLength/10;
   long i=0;
   int flag=0;
   long begin=System.currentTimeMillis();
    while((first=di.read())!=-1){
     ds.write(first);
     //如果文件大小大于1KB
     if(fileLength>2048){
      i++;
     if(i%j==0){
       flag+=10;
       if(flag==100){
        System.out.print("100%!");
       }else{
        System.out.print(flag+"%-->");
       }
      
      }
     }
    }
    ds.flush();
    //关闭输入输出流
    ds.close();
    di.close();
    long end=System.currentTimeMillis();
    long costTime=end-begin;
    double average=0;
    String speed="网络最大值";
    if(costTime>1000){
     average=costTime/1000;
    }
    if(costTime!=0){
     speed=(fileLength/costTime)+"Kb";
    }
   
    System.out.println();
    System.out.println("客户端发送文件 "+fileName+" 完毕!");
    System.out.println("一共用时: "+average+" 秒   平均速度: "+speed);
   
    //接收服务器端返回的信息(此处需要等待服务器的返回信息)(需要实现一个ServerSocket来监听并获得信息)
   GetReturnInfo getReturnInfo=new GetReturnInfo();
   getReturnInfo.listeningPort();
    System.out.println("---------------------------------------------------------------------------");
  }catch(IOException e){
   e.printStackTrace();
  }finally{
   try {
    if(outputStream!=null){
     outputStream.close();
    }
    if(inputStream!=null){
     inputStream.close();
    }
     if(clientSocket!=null){
      clientSocket.close();
     }
   } catch (IOException e) {
    e.printStackTrace();
   }
   
  }
 }
}
------------------------------

GetReturnInfo.java

package com.xinxin.Client;
import java.io.*;
import java.net.*;
/**
 * @author Administrator
 *@version 1.0
 *GetReturnInfo类接收服务器端关于文件复制成功与否的信息
 */
public class GetReturnInfo {
 private ServerSocket serverSocket;
 private Socket clientSocket ;
 private int port=9001;
 private InputStream inputStream;
 public GetReturnInfo(){
  try {
   serverSocket=new ServerSocket(port);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void listeningPort(){
  try {
   clientSocket=serverSocket.accept();
   inputStream=clientSocket.getInputStream();
   BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
   String returnInfo="";
   while((returnInfo=br.readLine())!=null){
    System.out.println(returnInfo);
   }
   br.close();
   inputStream.close();
   clientSocket.close();
   serverSocket.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}
------------------

package com.xinxin.Client;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import javax.swing.*;

/**
 * @author Administrator
 *@version 1.0
 *ClientApp类实现文件传输的实例
 */
public class ClientApp extends JFrame implements ActionListener{
 //设置窗口位置
 private JButton startTransferButton;
 private JButton closeButton;
 private Toolkit toolkit;
 private int frameWidth=300;
 private int frameHeight=70;
 private int posX;
 private int posY;
 private int winWidth;
 private int winHeight;
 //待传输的文件
 private FileSelection fs;
 private ArrayList <File>files;
 
 private int port;//服务器端口
 private InetAddress ipAddress;//服务器IP地址
 public ClientApp(){
  //传输的文件信息设置
  fs=new FileSelection();
  fs.initFileArrayList();
  files=fs.getFileArrayList();
  
  //服务器连接信息设置
  byte [] ip=new byte[4];
  ip[0]=(byte)192;
  ip[1]=(byte)168;
  ip[2]=1;
  ip[3]=105;
  try {
   ipAddress=InetAddress.getByAddress(ip);
  } catch (UnknownHostException e) {
   e.printStackTrace();
  }
  port=9000;
  //窗口显示信息设置
  toolkit=Toolkit.getDefaultToolkit();
  winWidth=toolkit.getScreenSize().width;
  winHeight=toolkit.getScreenSize().height;
  //设置窗口位置
  posX=(winWidth-frameWidth)/2;
  posY=(winHeight-frameHeight)/2;
  //添加组件
  startTransferButton=new JButton("Start Transfer Files");
  startTransferButton.addActionListener(this);
  closeButton=new JButton("Close the Window");
  closeButton.addActionListener(this);
  setTitle("文件备份客户端");
  add(startTransferButton);
  add(closeButton);
  setSize(frameWidth,frameHeight);
  setLocation(posX,posY);
  setLayout(new FlowLayout());
  setResizable(false);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 //按钮按下时开始传输文件
 @Override
 public void actionPerformed(ActionEvent event) {
  if(event.getSource()==startTransferButton){
    for(int i=0;i<files.size();i++){
     new BackupClient(ipAddress,port,files.get(i)).run();
    }
  }else if(event.getSource()==closeButton){
   System.exit(0);
  }
 }
 public static void main(String args[]){
  new ClientApp();
 }
}
-------------------------------

Server端

package com.xinxin.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
 *
 * @author Administrator
 *@version 1.0
 *BackupServer类提供了服务器端端口监听
 */
public class BackupServer {
 private int port;//服务器端口
 private ServerSocket serverSocket;//服务器端套接字
 private Socket clientSocket;//客户端套接字
 private int times=0;
 //构造函数初始化端口
 public BackupServer(int port){
  this.port=port;
 }
 //监听端口等待客户端的连接
 public void listeningPort(){
  try {
   serverSocket=new ServerSocket(port);
   while(true){
    System.out.println("正在监听端口 "+port+"...");
    clientSocket=serverSocket.accept();
    //接收到客户端的连接后,新建一个线程处理连接
    ++times;
    System.out.println("["+times+"]:接收到来自"+clientSocket.getRemoteSocketAddress()+"的主机连接服务器信息...");
    System.out.println("接受客户端连接..."+times);
    new Thread(new BackupServerHandle(clientSocket)).start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 /*//关闭服务器
 public void shutdownServer(){
  if(serverSocket!=null){
   try {
    serverSocket.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 public ServerSocket getServerSocket() {
  return serverSocket;
 }*/

}
-------------

package com.xinxin.Server;
import java.io.*;
import java.net.*;
/**
 *
 * @author Administrator
 *@version 1.0
 *BackupServerHandle类提供了服务器端多线程处理文件备份
 */
public class BackupServerHandle implements Runnable {
 private InputStream inputStream;//网络输入流
 private OutputStream outputStream;//网络输出流
 private File dir;//存储文件的目录
 private Socket clientSocket;//客户端套接字
 public BackupServerHandle(Socket client){
  //新建存储目录
  dir=new File("RemoteBackup");
  if(!dir.exists()){
   dir.mkdir();
  }
  clientSocket=client;
 }
 @Override
 public void run() {
  try{
   //定义接收的文件名称和长度
   String fileName="";
   long fileLength=0;
   //获得网络输入输出流
   inputStream=clientSocket.getInputStream();
   outputStream=clientSocket.getOutputStream();
   
   //构建本地输入输出流
   DataInputStream dataInputStream=new DataInputStream(new BufferedInputStream(inputStream));
   fileName=dataInputStream.readUTF();//读取文件名
   fileLength=dataInputStream.readLong();//读取文件长度
   
   String backFileName="RemoteBackup\\"+fileName.substring(5);
   int index=0;
   index=backFileName.lastIndexOf('\\');
   String dirStr=backFileName.substring(0, index);
   File backDir=new File(dirStr);
   backDir.mkdirs();
   
   //将客户端发送的数据写入磁盘文件中
   DataOutputStreamdataOutputStream=new DataOutputStream(new BufferedOutputStream(newFileOutputStream(dir.getAbsolutePath()+"\\"+fileName.substring(5))));
   int first;
   while((first=dataInputStream.read())!=-1){
    dataOutputStream.write(first);
   }
   dataOutputStream.flush();
   System.out.println("服务器备份文件 "+fileName+" 成功!");
   
   //关闭输入输出流
   dataOutputStream.close();
   //发送信息给客户端(需要实现另一个Socket来发送信息)
   long tempLength=0;
   File tempFile=new File(dir.getAbsolutePath()+"\\"+fileName.substring(5));
   tempLength=tempFile.length();
   System.out.println("Send Length:"+fileLength);
   System.out.println("Get Length:"+tempLength);
   String returnInfo="";
   if(tempLength==fileLength){
    returnInfo="服务器备份文件 "+fileName+"成功!";
    SendReturnInfo send=new SendReturnInfo(clientSocket.getInetAddress(),returnInfo);
    send.sendReturnInfo();
    System.out.println("已发送复制 "+fileName+" 成功信息给客户端!");
   }
   else{
    returnInfo="服务器备份文件 "+fileName+"失败!";
    SendReturnInfo send=new SendReturnInfo(clientSocket.getInetAddress(),returnInfo);
    send.sendReturnInfo();
    System.out.println("已发送复制 "+fileName+"失败信息给客户端!");
   }
   System.out.println("---------------------------------------------------");
  }catch(IOException e){
   e.printStackTrace();
  }finally{
   try{
    if(outputStream!=null){
     outputStream.close();
    }
    if(inputStream!=null){
     inputStream.close();
    }
     if(clientSocket!=null){
      clientSocket.close();
     }
   }catch(IOException e){
    e.printStackTrace();
   }
  }
  
 }

}
----------------

package com.xinxin.Server;
import java.io.*;
import java.net.*;
/**
 * @author Administrator
 *@version 1.0
 *SendReturnInfo类接收服务器端关于文件复制成功与否的信息
 */
public class SendReturnInfo {
  private Socket clientSocket;
  private OutputStream outputStream;
  private InetAddress ipAddress;
  private int port=9001;
  private String returnInfo;
  public SendReturnInfo(InetAddress ipAddress,String returnInfo){
   this.ipAddress=ipAddress;
   this.returnInfo=returnInfo;
  }
  public void sendReturnInfo(){
   try {
    clientSocket=new Socket(ipAddress,port);
    outputStream=clientSocket.getOutputStream();
    PrintWriter printWriter=new PrintWriter(outputStream,true);
    printWriter.println(returnInfo);
    printWriter.close();
    outputStream.close();
    clientSocket.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
}
--------------

package com.xinxin.Server;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
/**
 *
 * @author Administrator
 *@version 1.0
 *ServerApp类提供服务器运行实例
 */
public class ServerApp extends JFrame implements ActionListener{

 private JButton startServerButton;
 private BackupServer backupServer;
 private Toolkit toolkit;
 private int frameWidth=220;
 private int frameHeight=70;
 private int posX;
 private int posY;
 private int winWidth;
 private int winHeight;
 public ServerApp(){
  toolkit=Toolkit.getDefaultToolkit();
  winWidth=toolkit.getScreenSize().width;
  winHeight=toolkit.getScreenSize().height;
  //设置窗口位置
  posX=(winWidth-frameWidth)/2;
  posY=(winHeight-frameHeight)/2;
  
  startServerButton=new JButton(" Start Backup Server ");
 
  
  startServerButton.addActionListener(this);
 
  setTitle("文件备份服务器端");
  setLayout(new FlowLayout());
  
  add(startServerButton);
 
 
  setSize(frameWidth,frameHeight);
  setLocation(posX,posY);
  setResizable(false);
  setVisible(true);
  
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 public static void main(String args[]){
   new ServerApp();
 }
 @Override
 public void actionPerformed(ActionEvent event) {
  if(event.getSource()==startServerButton){
   backupServer=new BackupServer(9000);
   backupServer.listeningPort();
  } 
 }
}

Eclipse工程,整理一下,导入即可

在工程下面新建一个Test文件夹,放入任何东西,然后运行程序即可。

  评论这张
 
阅读(2386)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017