欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java小练习之文件迁移(文件上传)

程序员文章站 2022-07-10 12:17:28
...
  • 需求:
    1. 从客户端发送文件到服务端,服务端接收后返回一个成功接收的信息
    2. 服务端能接收多个客户端发送文件
  • 具体代码实现
    • 客户端程序:
 public static void main(String[] args) throws IOException {
        //本地输入流,用来读取文件数据
        FileInputStream fis = new FileInputStream("E://1.jpg");
        //新建客户端对象,传入服务器端的ip地址和端口
        //将此处ip修改为另一台电脑ip,然后在另一台电脑执行服务端程序即可实现两台电脑之间的文件传输
        Socket socket = new Socket("127.0.0.1",8888);

        //得到网络输出流,用于处理网络传输中的数据流
        OutputStream os = socket.getOutputStream();

        //读取数据并传输
        int len = 0;
        byte[] b = new byte[1024];
        while ((len=fis.read(b)) != -1){
            os.write(b,0,len);
        }
        //结束传输,因为os没法传输文件终止标记
        socket.shutdownOutput();

        //得到网络输入流,用于读取服务端返回的数据
        InputStream is = socket.getInputStream();

        //读取返回的数据并输出
        while((len = is.read(b)) != -1){
            System.out.println(new String(b,0,len));
        }

        //释放资源
        fis.close();
        socket.close();
    }
  • 服务端程序
public static void main(String[] args) throws IOException {
        //新建服务端对象,并绑定指定端口
        ServerSocket server = new ServerSocket(8888);
        //一直监听客户端,上传一次文件就保存一个文件
        while (true){
            //因为要使用客户端的网络输入输出流,故先得到客户端对象
            Socket socket = server.accept();
            //开启多线程,这样子每读取一个文件并保存就是一个线程,提高效率
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //得到网络输入流,用于读取客户端传输的数据
                        InputStream is = socket.getInputStream();

                        //把数据保存成文件并放在一个文件夹下
                        File file = new File("E://upload");
                        //判断是否存在该文件夹,没有则创建
                        if(!file.exists()){
                            file.mkdirs();
                        }

                        //自定义文件名命名规则:picture+当前毫秒值+随机数
                        String fileName = "picture"+System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";

                        //创建本地输出流,用于把客户端传输的数据写入到文件里
                        FileOutputStream fos = new FileOutputStream(file+"//"+fileName);

                        //读取客户端传输的数据并写入文件
                        int len = 0;
                        byte[] b = new byte[1024];
                        while ((len=is.read(b)) != -1){
                            fos.write(b,0,len);
                        }

                        //得到网络输出流,给客户端反馈数据
                        OutputStream os = socket.getOutputStream();
                        os.write("成功接收".getBytes());

                        //释放资源
                        fos.close();
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }