[JAVA]递归实现客户端与服务端之间的文件与文件夹传输

JAVA实现文件与文件夹传输

声明

本代码的文件夹传输并非完全由本人完成,本人只是在实现递归的基本思想上,稍微处理与改动了原作者的代码的结构,从而实现了文件与文件夹传输。

基本思想:
1、通过递归的形式,创造方便区分开识别文件与文件夹的方法。

2、基于原作者的字符识别的思想,在服务器端可以识别接收文件或文件夹。

其他方法

组合设计模式实现,网上一大把,自己改吧!

客户端:

package My_File_TCP;

import java.io.*;
import java.net.*;

public class MyClient{
    Socket client;
    boolean flag=true;
    FileInputStream fis;//此输入流负责读取本机上要传输的文件
    DataOutputStream dos;//此输出流负责向另一台电脑(服务器端)传输数据
    DataInputStream dis;//此输入流负责读取另一台电脑的回应信息
    
    public static void main(String[] args) throws Exception{
    new MyClient().ClientStart();
}

public void ClientStart() throws Exception{
    try{
        client=new Socket("127.0.0.1",8080);//服务器端的IP,(这个只是在局域网内的)我的是这个,你的根据实际而定
        System.out.println("已连接");
        dos=new DataOutputStream(client.getOutputStream());
        dis=new DataInputStream(client.getInputStream());
        String sc = "E:\\javatest_repositories";//这里你可以直接写成文件夹的路径或文件的路径
        File fi1=new File(sc);
        if(fi1.isDirectory()){//识别一开始你的是不是文件。是就以递归的形式,发送给服务端
            copydirectory(fi1,sc);
        }else if(fi1.isFile()){//如果你发送的是文件,那么就发给服务端
            String str1=sc.substring(0,sc.lastIndexOf("\\"));
            System.out.println(str1);
            copyfile(fi1,str1,dos,dis);
        }else{//加入错误提示
            System.out.println("请认真输入路径");
        }
        
        String s="/]00";//提示传输完毕的标记
        byte b[]=s.getBytes();
        dos.write(b,0,s.length());
        dos.flush();
    }catch(Exception e){
        System.out.println("Error");
    }
}

public void copyfile(File file,String ss1,DataOutputStream dos1,DataInputStream dis1){
    byte buff[];
    String str;
    int ti;
    try{
        fis=new FileInputStream(file);
        str="/]0c"+(file.getPath().replace(ss1,""));//这是一个文件的名称
        buff=str.getBytes();
        dos1.write(buff);
        dos1.flush();
        dis1.read();
        dos1.writeInt(fis.available());//传输一个整型值,指明将要传输的文件的大小
        dos1.flush();
        dis1.read();
        buff=new byte[10000];
        while(fis.available()>0){//开始传送文件
        ti=fis.read(buff);
        dos1.write(buff,0,ti);
        dos1.flush();
        }
        dos1.flush();
        fis.close();
        dis1.read();
        }catch(Exception e){
            e.printStackTrace();
        }
    }


public void copydirectory(File f,String ss)throws Exception{//这是传输的核心,而且将被递归
    byte b[]=null;
    String ts=null;
    for(File f1:f.listFiles()){ //首先通过if语句判断f1是文件还是文件夹
        if(f1.isDirectory()){ //fi是文件夹,则向服务器端传送一条信息
        ts="/]0f"+(f1.getPath().replace(ss,""));//"/]0f"用于表示这条信息的内容是文件夹名称
        b=ts.getBytes();
        dos.write(b);
        dos.flush();
        dis.read();
        copydirectory(f1,ss);//由于f1是文件夹(即目录),所以它里面很有可能还有文件或者文件夹,所以进行递归
        }else{
            copyfile(f1,ss,dos,dis);
        }
    }
  }
}

服务端:

package My_File_TCP;

import java.io.*;
import java.net.*;
public class MyServer{
    ServerSocket server=null;
    Socket client=null;
    boolean flag=true;
    DataInputStream dis;
    DataOutputStream dos;
    
    public static void main(String[] args){
        new MyServer().ServerStart();
    }
    
    public void ServerStart(){
        try{
            server=new ServerSocket(8080);
            System.out.println("端口号:"+server.getLocalPort());
            client=server.accept();//等待接收
            System.out.println("连接完毕");
            dis=new DataInputStream(client.getInputStream());
            dos=new DataOutputStream(client.getOutputStream());
            try{
                Copy(dis,dos);
            }catch(Exception e){
            e.printStackTrace();
            }finally{
            client.close();
            server.close();
            }
        }catch(IOException e){
            System.out.println("Error");
        }
    }
    
    public void Copy(DataInputStream dis1,DataOutputStream dos1) throws Exception{
            String answer="g";
            byte ans[]=answer.getBytes();
            byte b[]=new byte[1000];
            int ti;
            int count1=0;//计算收到文件夹的次数
            int count2=0;//计算收到文件的次数
            new File("e:\\2").mkdirs();
            FileOutputStream fos;
        while(flag){
                ti=dis1.read(b);
                dos1.write(ans);
                String select=new String(b,0,ti);
                if(select.contains("/]0f")){//识别文件夹
                    File f=new File("e:\\2\\"+(select.replace("/]0f","")));//去掉标识
                    count1++;
                    System.out.println("creat directory "+count1+" times");
                    f.mkdirs();
                }else if(select.contains("/]0c")){//识别文件
                    fos=new FileOutputStream("e:\\2\\"+(select.replace("/]0c","")));
                    int tip=dis1.readInt();
                    dos1.write(ans);
                    while(tip>0){
                        ti=dis1.read(b,0,(tip>1000?1000:tip));
                        tip=tip-ti;
                       String cs=new String(b,0,4);
                        fos.write(b,0,ti);
                    }
                    count2++;
                    fos.flush();
                    fos.close();
                    dos1.write(ans);
                    System.out.println("creat file "+count2+" times");
                }else if(select.contains("/]00")){
                    flag=false;//彻底结束的标志
                    System.out.println("creat successfully");
                }
            }
            dis1.close();
    }
}

参考的代码的地址:
https://zhidao.baidu.com/question/112118386.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值