Java:Socket断点传输大文件

0x00. 解决思路

  • Sever端负责接收指令(文件路径、第几块、每块大小),读取相应的文件中的块数据,返回给Client(顺便附上有效数据长度、MD5)。
  • Client端负责控制断点,通过断点向Server发送指令,接收数据后判断数据完整性(有效数据长度、MD5),再将数据写入目标文件。
  • 由于Java流处理类实在繁多,本次实验就统一采用 In/OutputStreamFileIn/FileOutputStream 字节流传输类来传输数据。
  • 多线程的Server还没摸清楚,这里就只用单线程了。
  • Client发给Server的指令为UTF-8编码的字符串,格式为文件路径|第几块|每块大小
  • Server发送给Client的数据为字节数组,格式为:
    数据长度,4字节int 数据MD5,16字节数组 文件块数据,长度由数据长度指定

0x01. Server端实现

  • 监听端口,等待Client连接:

    ServerSocket server = new ServerSocket(port);  // 监听localhost:port
    Socket handle = server.accept();  // 等待Client接入
    
    OutputStream out = handle.getOutputStream();
    InputStream in = handle.getInputStream();
    
  • 设定指令缓冲区:

    final int orderBufSize = 1024;
    byte[] orderBuf = new byte[orderBufSize];
    
  • 一直监听指令,直到Client结束:

    while (true) {
          
        // 接收并解析Client发过来的指令
        
        // 通过指令读取指定文件中的指定块
    
        // 数据附上有效数据长度和MD5值
    
        // 将数据发送给Client
    }
    // 关闭连接
    
    • 接收并解析Client发过来的指令:

      // 接收指令
      int orderLen = in.read(orderBuf, 0, orderBufSize);
      if (orderLen <= 0) {
              
          break;
      }
      String orderStr = new String(orderBuf, 0, orderLen, "UTF-8");
      // 解析指令
      String[] orders = orderStr.trim().split("\\|");  // 正则表达式,用竖线分割字符串
      final String filePath = orders[0];  // 目标文件路径
      final int pieceIndex = Integer.parseInt(orders[1]);  // 目标数据块
      final int pieceBufSize = Integer.parseInt(orders[2]);  // 每块大小
      
    • 读取指定文件中的指定块:

      byte[] pieceBuf = new byte[pieceBuf
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值