JAVA C/S文件传输

1.客户机

package com.zhao.updata;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Updata_Client {

    public Updata_Client() {

    }

    /**
     * 1.提示要上传的路径,验证文件夹是否存在或者是否是路径 2.发送文件名到服务端 3.接受结果,如果存在给予提示,程序直接退出
     * 4.如果不存在,定义FileInputStream 读取文件,写出到网络
     * 
     * @param args
     * @throws IOException
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws IOException {
        // * 1.提示要上传的路径,验证文件夹是否存在或者是否是路径
        File filename = getFile();
        // * 2.发送文件名到服务端
        Socket socket = new Socket("127.0.0.1", 65534);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println(filename.getName());
        // * 3.接受结果,如果存在给予提示,程序直接退出
        String result = br.readLine();
        boolean flag = isfile_server(socket, br, ps, result, filename);
        // * 4.如果不存在,定义FileInputStream 读取文件,写出到网络
        if (flag) {
            FileInputStream fis = new FileInputStream(filename);
            byte[] arr = new byte[8192];
            int len;
            // double progress=0; //进度
            // int sump=fis.available(); //返回字节文件输入流中可读取的字节数
            while ((len = fis.read(arr)) != -1) {
                ps.write(arr, 0, len);

                // progress=len/sump; //进度
                // System.out.println("当前进度:"+progress+"%");
            }
            System.out.println("传输完成");
            fis.close();
            socket.close();
        }
    }

    private static boolean isfile_server(Socket socket, BufferedReader br, PrintStream ps, String result, File filename)
            throws IOException {

        if ("ok".equals(result)) {
            System.out.println("您上传的文件服务器端已经存在,请不要重复上传!");
            System.out.println("\n\n请您重新输入!");// System.out.println("\n\n请您重新输入或输入Q退出!");
            // if("Q".equals(br.readLine())){
            // socket.close();
            // System.exit(0); //退出程序
            // }

            socket.close();

        } else if ("no".equals(result)) {
            return true; // 可以上传
        }
        return false;
    }

    private static File getFile() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要上传的文件路径:");
        while (true) {
            String line = sc.nextLine();
            File file = new File(line);
            if (!file.exists()) {
                System.out.println("您输入的文件路径不存在!");

            } else if (file.isDirectory()) {
                System.out.println("您输入的是文件夹路径,请输入文件路径!");

            } else {
                return file;
            }
        }

    }

}

2.服务器

package com.zhao.updata;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Updata_Server {

    public Updata_Server() {
        // TODO 自动生成的构造函数存根
    }
    /**
     * 1.建立多线程的服务器
     * 2.读取文件名
     * 3.判断文件是否存在,将结果发送到客户端
     * 4.定义FileOutputStream ,从网络读取数据,存储到本地
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
//         * 1.启动服务器
        ServerSocket server=new ServerSocket(65534);
        System.out.println("服务器启动,绑定65534端口");
//         * 2.建立多线程的服务器,读取文件名
        while(true){
            final Socket socket=server.accept();
            new Thread(){
                public void run() {
                    try {
                        InputStream inputStream = socket.getInputStream();
                        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        String flenames = br.readLine(); // 获取客户端发过来的文件名
                        // * 3.判断文件是否存在,将结果发送到客户端
                        File dir = new File("updata");
                        if (!dir.isDirectory()) {
                            dir.mkdir(); // 在服务器端创建updata文件夹
                        }
                        File file = new File(dir, flenames);
                        if (file.exists()) {
                            System.out.println("ok"); // 服务器端已经存在该文件了
                            ps.println("ok");
                            socket.close();
                            return;
                        } else {
                            ps.println("no");
                            System.out.println("no");
                        }

                        // 4.定义FileOutputStream ,从网络读取数据,存储到本地
                        FileOutputStream fos = new FileOutputStream(file);
                        byte[] arr = new byte[8192]; // 创建字节数组
                        int len;

                        while ((len = inputStream.read(arr)) != -1) {
                            fos.write(arr, 0, len);

                        }

                        fos.close();
                        socket.close();
                    } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }
                };
            }.start();
            
        }

        
        
        
    }

}
View Code

3.运行

posted @ 2019-03-17 18:48  Angry-rookie  阅读(555)  评论(0)    收藏  举报