美文网首页
【Java】【网络编程】多线程上传文件

【Java】【网络编程】多线程上传文件

作者: JerichoPH | 来源:发表于2017-04-08 09:02 被阅读85次

多线程上传文件

// 客户端
public class Demo_Upload_Client {
    public static void main(String[] args) throws Exception {
        // 1. 提示输入要上传的文件路径,验证路径是否存在以及是否是文件夹
        File file = getFile();
        // 2. 发送文件到服务器
        Socket socket = new Socket("127.0.0.1", 6666);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println(file.getName());
        // 6. 接收结果,如果存在给予提示,程序直接退出
        String result = br.readLine();// 读取结果
        if ("文件存在".equals(result)) {
            System.out.println("文件已经存在");
            socket.close();
            return;
        } else {
            // 7. 不存在,定义FileInputStream读取文件,写出到网络
            FileInputStream fis = new FileInputStream(file);
            byte[] arr = new byte[8192];
            int len;
            while ((len = fis.read(arr)) != -1) {
                ps.write(arr, 0, len);
            }
            fis.close();
            socket.close();
        }
    }

    /**
     * 获取文件对象
     * 
     * @return File
     */
    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;
            }
        }
    }
}

// 服务器
public class Demo_Upload_Server {
    public static void main(String[] args) throws Exception {
        // 3. 建立多线程服务器
        ServerSocket ss = new ServerSocket(6666);
        System.out.println("服务器启动");
        // 4. 读取文件名
        while (true) {
            final Socket socket = ss.accept();// 接收请求
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            PrintStream ps = new PrintStream(socket.getOutputStream());
            new Thread() {
            
                @Override
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        String fileName = br.readLine(); // 读取文件名
                        File dir = new File("update");
                        dir.mkdir();
                        File file = new File(dir, fileName);
                    
                        // 5. 判断文件是否已经存在
                        if (file.exists()) {
                            ps.println("文件存在");
                            socket.close();
                            return;
                        } else {
                            ps.println("不存在");
                        }
                    
                        // 8. 定义FileOutputStream,从网络读取数据,存储到本地
                        FileOutputStream fos = new FileOutputStream(file);
                        byte[] arr = new byte[8192];
                        int len;
                    
                        while ((len = is.read(arr)) != -1) {
                            fos.write(arr, 0, len);
                        }
                        fos.close();
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
}

相关文章

网友评论

      本文标题:【Java】【网络编程】多线程上传文件

      本文链接:https://www.haomeiwen.com/subject/niflattx.html