Java入门--socket文件上传

2020-12-02  本文已影响0人  王二麻子88

Java入门--Socket文件上传

一. socket客户端

package io.github.wangermaizi.day10;

// 基于TCP的文件上传

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

public class TCPUploadClient {
    public static void main(String[] args) throws IOException {
        // 1. 获取本地文件资源
        FileInputStream fis = new FileInputStream("C:\\Users\\LSY\\Desktop\\sys_path.txt");

        // 2. 创建 socket 客户端
        Socket socketClient = new Socket("127.0.0.1", 8888);

        // 3. 向socket 输出本地资源
        OutputStream ops = socketClient.getOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        // fis.read(bytes) 读取本地字节资源, 直到读取到 -1 结束, 但是程序并不会读取到-1
        // 此时, 程序读取不到结束标记就是进入阻塞状态, 等待结束标记, 后续代码均不会执行
        while ((len = fis.read(bytes)) != -1 ) {
            // 循环读取本地资源, 并往socket输出流
            ops.write(bytes,0, len);
        }
        /*
         * 解决方案:
         *  使用 socket对象的 shutdownOutput() 停止输出流
         * */
        socketClient.shutdownOutput();
        // 读取结束之后要即时关闭文件资源
        fis.close();
        // 等待保存数据成功之后的响应内容 (也是流字节的形式)
        InputStream ips = socketClient.getInputStream();
        while ((len = ips.read(bytes))!= -1) {
            System.out.println(new String(bytes, 0, len));
        }
        socketClient.shutdownInput();
        socketClient.close();
    }
}

. socket服务端

package io.github.wangermaizi.day10;

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


// 基于TCP上传的服务端
public class TCPUploadServe {
    public static void main(String[] args) throws IOException {
        // 1. 读取socket传过来的资源
        ServerSocket socketServe = new ServerSocket(8888);
        // 与客户端建立标识符, 使用客户端的流做输入, 输出
        Socket socketClient = socketServe.accept();

        // 创建接收资源的流
        InputStream ips = socketClient.getInputStream();

        // 判断保存的文件是否存在, 不存在就自动创建一个
        File file = new File("D:\\upload");
        if (!file.exists()) {
            // 不存在, 创建
            file.mkdirs();
        }

        // 输出资源==>保存资源至本地 (文件资源在操作结束之后记得及时关闭)
        FileOutputStream fos = new FileOutputStream(file+ "\\sys.txt");
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = ips.read(bytes)) != -1) {
            // 循环读取内容
            fos.write(bytes, 0, len);
        }
        System.out.println("保存成功, 正在告知客户端");

        // 保存成功之后告诉客户端保存成功
        OutputStream ops = socketClient.getOutputStream();
        ops.write("上传成功".getBytes());

        // 文件写完之后要及时关闭文件资源
        fos.close();
        socketClient.close();
        socketServe.close();
    }
}

上一篇下一篇

猜你喜欢

热点阅读