• 使用网路编程的思想,实现文件拷贝


    package com.itcast.demo02.FileUpload;

    import jdk.internal.org.objectweb.asm.tree.TryCatchBlockNode;

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;

    /**
    * @author newcityman
    * @date 2019/7/31 - 21:59
    * 文件上传案列服务器端:读取客户端上传的数据,保存到服务器的硬盘中,给客户端会写“上传成功”
    * 明确:
    * 数据源:客户端上传的文件
    * 目的地:服务器的硬盘 I:\upload\light.jpg
    * 实现步骤:
    * 1、创建一个服务器serverSocket对象,和系统要指定的端口号
    * 2、使用serverSocket对象中的方法accept,获取到请求的客户端socket对象
    * 3、使用socket对象中的方法getInputStream,获取到网络字节输入流InputStream
    * 4、判断I:\upload文件夹是否存在,不存在则创建
    * 5、创建一个本地输出流FileOutputStream对象,构造方法中绑定要输出的目的地
    * 6、使用网络字节输入流InputStream的read方法,读取从客户端上传得数据
    * 7、使用本地输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
    * 8、使用socket对象的getOutputStream,获取到网络字节输出流OutputStream
    * 9、使用网络字节输出流对象的write方法,向客户端会写“上传成功”
    * 10、释放资源(serverSocket,socket,FileOutputStream)
    */
    public class TCPServer {
    public static void main(String[] args) throws IOException {
    // 1、创建一个服务器serverSocket对象,和系统要指定的端口号
    ServerSocket ss = new ServerSocket(8888);
    // 2、使用serverSocket对象中的方法accept,获取到请求的客户端socket对象
    /*让服务器一直处于监听状态(死循环accept方法)
    * */
    while (true) {
    Socket socket = ss.accept();
    /* 使用多线程技术,提高程序的效率
    * 有一个客户上传文件,就启动一个线程,完成文件的上传
    * */

    new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    // 3、使用socket对象中的方法getInputStream,获取到网络字节输入流InputStream
    InputStream in = socket.getInputStream();
    // 4、判断I:\upload文件夹是否存在,不存在则创建
    File file = new File("I:\upload");
    if (!file.exists()) {
    file.mkdirs();
    }
    // 5、创建一个本地输出流FileOutputStream对象,构造方法中绑定要输出的目的地
    String filename = "hope" + System.currentTimeMillis() + new Random().nextInt(999999) + ".jpg";
    FileOutputStream fos = new FileOutputStream(file + "\" + filename);
    // 6、使用网络字节输入流InputStream的read方法,读取从客户端上传得数据
    int len = 0;
    byte[] bytes = new byte[2048];
    while ((len = in.read(bytes)) != -1) {
    // 7、使用本地输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
    fos.write(bytes, 0, len);
    }
    // 8、使用socket对象的getOutputStream,获取到网络字节输出流OutputStream
    OutputStream os = socket.getOutputStream();
    // 9、使用网络字节输出流对象的write方法,向客户端会写“上传成功”
    os.write("上传成功".getBytes());
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }).start();
    }
    // ss.close();
    }
    }


    package com.itcast.demo02.FileUpload;

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;

    /**
    * @author newcityman
    * @date 2019/7/31 - 21:22
    * 文件上传案例的客户端,上传到服务器,读取服务器回写的数据
    * 数据源:E:zmy.jpg
    * 目的地:服务器
    *
    * 实现步骤:
    * 1、创建一个本地直接输入流FlieInputStream对象,构造方法中绑定要读取的数据源
    * 2、创建一个客户端Socket对象,构造方法中指定服务器的ip地址和端口号
    * 3、使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
    * 4、使用本地字节输入流FileInputStream对象中的read,读取本地文件
    * 5、使用网络字节输出流OutputStream对象中的write,把读取到的文件上传到服务器
    * 6、使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
    * 7、使用网络字节输入流InputStream对象中的方法read读取服务器回写的数据
    * 8、释放资源
    */
    public class TCPClient {
    public static void main(String[] args) throws IOException{
    // 1、创建一个本地直接输入流FlieInputStream对象,构造方法中绑定要读取的数据源
    FileInputStream fis= new FileInputStream("E:\zmy.jpg");
    // 2、创建一个客户端Socket对象,构造方法中指定服务器的ip地址和端口号
    Socket socket = new Socket("127.0.0.1",8888);
    // 3、使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
    OutputStream os = socket.getOutputStream();
    // 4、使用本地字节输入流FileInputStream对象中的read,读取本地文件
    int len=0;
    byte[] bytes = new byte[2048];
    while ((len=fis.read(bytes))!=-1){
    // 5、使用网络字节输出流OutputStream对象中的write,把读取到的文件上传到服务器
    os.write(bytes);
    }
    //给socket添加一个结束符
    socket.shutdownOutput();
    // 6、使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
    InputStream in = socket.getInputStream();
    // 7、使用网络字节输入流InputStream对象中的方法read读取服务器回写的数据
    while ((len=in.read(bytes))!=-1){
    System.out.println(new String(bytes,0,len));

    }

    // 8、释放资源
    socket.close();
    fis.close();
    }
    }
  • 相关阅读:
    git代码回退
    7 用两个栈实现队列
    《Java并发编程实战》学习笔记
    226. Invert Binary Tree
    Interface与abstract类的区别
    Override和Overload的区别
    Java面向对象的三个特征与含义
    String、StringBuffer与StringBuilder的区别
    Hashcode的作用
    Object有哪些公用方法
  • 原文地址:https://www.cnblogs.com/newcityboy/p/11279944.html
Copyright © 2020-2023  润新知