java通过socket实现简单网盘模拟,选择文件,查询该文件所包含的文件,下载,上传(控制台打印输出,简单易懂,无需前端,附详细代码直接运行)

前言:

只需要开发工具ideal,最基础的java项目,无需任何框架。主要就是模拟网盘的功能,通过开创多个文件夹来区分服务器的空间,客户端的本地空间,话不多说先看效果图

执行步骤:

1.开启服务器

2.客户端发送文件名给服务器

3.服务器查询到该文件所包含的文件

4.服务器将包含的文件信息发送给客户端

5.客户端选择是下载还是上传

6.下载操作是从返回的文件中选择,将执行下载的文件保存到客户端下载的文件夹中

7.上传将自己已经下载过的文件上传到服务器

8.服务器将上传的文件保存到自己的文件夹中

 

 

 

 

 Client代码:

package com.dmdd.mywangpan;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    //客户端发送文件名给服务器的功能
    String JSONFileNames = "";
    private static final String DIR = "E:\\soft\\";
    private static final String DOWN_LOAD = "E:\\myWanPanDownLoad\\";
    private static final String IP = "192.168.56.1";

    public void sendFileName(String ip, int port, String fileName) {
        System.out.println("输入的文件名为" + fileName);
        //创建client对象
        try (Socket client = new Socket(ip, port)) {
            //创建Object输出流 将文件名输出到服务器端
            ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
            os.writeUTF(fileName);
            os.flush();
            os.close();
//            clientIS.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 接收文件信息合集
     *
     * @param ip
     * @param port
     */
    public void readJSONFileNames(String ip, int port) {
        try (Socket client = new Socket(ip, port)) {
            //创建输入流获取服务器端的Json字符串
            ObjectInputStream clientIS = new ObjectInputStream(client.getInputStream());
            JSONFileNames = clientIS.readUTF();
            System.out.println(JSONFileNames);
            clientIS.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 客户端指定返回过来的文件进行下载或者上传到服务器
     *
     * @param
     */
    public void upload(String ip, int port, String JSONFileNames) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请选择是下载文件,还是上传文件,扣1下载,扣2上传");
        int uploadOrDownLoad = scanner.nextInt();
        //执行下载文件的操作
        if (uploadOrDownLoad == 1) {
            //创建保存文件的文件夹
            File dir = new File(DOWN_LOAD);
            if (!dir.exists()) {
                System.out.println("文件不存在");
                dir.mkdir();
                return;
            }
            //将JSON字符串分隔开成数组
            String[] fileNames = JSONFileNames.split(",");
            System.out.println("请选择你想下载的文件");
            for (int i = 0; i < fileNames.length; i++) {
                System.out.println(i + 1 + fileNames[i]);
            }
            int select = scanner.nextInt();
            //获取想要下载的文件名
            String fileName = fileNames[select - 1];
            File file = new File(fileName);
            //创建输入流
            try {
                FileInputStream fileInputStream = new FileInputStream(DIR + fileName);
                //创建输出流
                FileOutputStream fileOutputStream = new FileOutputStream(DOWN_LOAD + fileName);
                byte[] buf = new byte[1024];
                int len = 0;
                //边读边写
                while ((len = fileInputStream.read(buf)) != -1) {
                    fileOutputStream.write(buf, 0, len);
                }
                System.out.println("文件下载成功请在" + DOWN_LOAD + fileName + "查看");
                fileInputStream.close();
                fileOutputStream.close();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //执行上传操作
        else {
            try (Socket client = new Socket(ip, port)) {
                File file = new File(DOWN_LOAD);
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    System.out.println(i + 1 + files[i].getName());
                }
                System.out.println("请选择您要上传的文件");
                int select = scanner.nextInt();
                //获取想要下载的文件名
                String fileName = files[select - 1].getName();
                File UploadFile = new File(fileName);

                //创建输入流
                FileInputStream fileInputStream = new FileInputStream(DOWN_LOAD + fileName);
                //创建输出流
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(client.getOutputStream());
                //将文件名传过去
                objectOutputStream.writeUTF(fileName);
                byte[] buf = new byte[1024];
                int len = 0;
                //边读边写
                while ((len = fileInputStream.read(buf)) != -1) {
                    objectOutputStream.write(buf, 0, len);
                }
                System.out.println("文件上传成功!");

                objectOutputStream.flush();
                objectOutputStream.close();
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        Client client = new Client();
        //教室ip为 192.168.1.114
        //家的ip为192.168.31.83    192.168.56.1
        client.sendFileName(IP, 8080, "E:\\soft");
        client.readJSONFileNames(IP, 8081);
        client.upload(IP, 8083, client.JSONFileNames);
    }
}

Server代码:

package com.dmdd.mywangpan;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Server {
    private static final int PORT = 8080;
    String JSONFileNames = "";
    private static final String UPLOAD_DIR = "E:\\wanPanUpload\\";

    /**
     * 通过客户端传来的文件名 遍历该文件下面的其他文件
     */
    public void serverListFiles() {
        System.out.println("服务器socket启动");
        //创建服务器对象
        try (ServerSocket server = new ServerSocket(PORT)) {

            //循环读取服务器接收客户端对象
            Socket client = server.accept();
            //创建对象输入流
            ObjectInputStream is = new ObjectInputStream(client.getInputStream());
            String fileName = is.readUTF();
            //获取客户端传到的文件名
            System.out.println("客户端传到的文件名为" + fileName);
            //通过文件名创建文件对象
            File file = new File(fileName);
            //获取文件名下面的其他文件集合
            File[] files = file.listFiles();
            //将文件数组转换为类型为File的List数组
            List<File> Filefiles = Arrays.stream(files).collect(Collectors.toList());
            //将List数组拼接为JSON字符串
            //创建储存多种文件名字的json字符串
            for (File file1 : Filefiles) {
                String name = file1.getName();
                System.out.println(name);
                //拼接到JSONFileNames
                JSONFileNames += name;
                JSONFileNames += ",";
            }
            //文件1,文件2,文件3,文件4
            String subStringJSON = JSONFileNames.substring(0, JSONFileNames.lastIndexOf(","));
            System.out.println(subStringJSON);
            is.close();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将json字符串发送给客户端
     *
     * @param
     */
    public void sendJson(String JSONFileNames) {
        try (ServerSocket serverSocket = new ServerSocket(8081)) {
            Socket client = serverSocket.accept();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(client.getOutputStream());
            objectOutputStream.writeUTF(JSONFileNames);
            objectOutputStream.flush();
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获得上传的文件
     *
     * @param
     */
    public void getFile() {
        try (ServerSocket server = new ServerSocket(8083)) {
            //判断存储上传文件的文件夹是否存在
            File file = new File(UPLOAD_DIR);
            if (!file.exists()) {
                System.out.println("上传文件夹不存在");
                file.mkdir();
            }
            Socket client = server.accept();
            ObjectInputStream objectInputStream = new ObjectInputStream(client.getInputStream());
            //获取文件名
            String fileName = objectInputStream.readUTF();
            //创建输出流 输出到文件夹里
            FileOutputStream fileOutputStream = new FileOutputStream(UPLOAD_DIR + fileName);
            byte[] buf = new byte[1024];
            int len = 0;
            //边读边写
            while ((len = objectInputStream.read(buf)) != -1) {
                fileOutputStream.write(buf, 0, len);
            }

            System.out.println("上传成功!请在" + UPLOAD_DIR + fileName + "查看");
            objectInputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Server server = new Server();
        server.serverListFiles();
        server.sendJson(server.JSONFileNames);
        server.getFile();
    }

}

主要操作就是流的运用,没有啥难度,该程序是方便大伙对socket的理解。注释写的很详细了,可以直接创建两个类将代码跑起来,给同学们看看效果,装装杯。让男同学仰慕你,让女同学爱上你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值