繁体   English   中英

如何通过byte []流读取多个文件的Socket InputStream?

[英]How to read Socket InputStream for multiple files over byte[] streams?

我下面发布的代码适用于通过套接字传输单个文件。 但这不适用于套接字上的多个文件传输。 当尝试通过套接字进行多个文件传输时,代码崩溃。

我通过遍历服务器发送代码x次数来发送多个文件,然后运行接收代码x次数。 当尝试发送多个文件时,第一个文件将成功发送,第二个文件名和大小将成功读取,但是此后发生我的代码错误。

在我的接收客户端中,我尝试使用以下建议: 通过套接字进行Java多文件传输,但没有成功。

该错误在客户端。

我要问的问题是:为什么此代码不能用于多个文件,如何解决?

服务器发送

try{
    byte[] bytes = new byte[(int)file.length()];
    FileInputStream fis = new FileInputStream(file);
    OutputStream os = socket.getOutputStream();

    out.println(file.getName()); // Send Filename
    out.println(file.length()); // Send filesize

    int count;
    while ((count = fis.read(bytes)) > 0) {
      os.write(bytes, 0, count);
    }
    os.flush();
    fis.close();
  }catch(IOException e){
    e.printStackTrace();
  }
}

客户收货

try{
  String file = in.readLine(); // Read filename
  int fileSize = Integer.parseInt(in.readLine()); // Read Filesize 
  //ERROR HAPPENING ON LINE ABOVE IN LOOPS AFTER THE FIRST
  byte [] buf  = new byte [fileSize];
  FileOutputStream fos = new FileOutputStream(file);
  InputStream is = socket.getInputStream();

  int count = 0;
  while (fileSize > 0 && (count = is.read(buf, 0, (int)Math.min(buf.length, fileSize))) != -1){
    fos.write(buf, 0, count);
    fileSize -= count;
  }

  fos.close();
}catch(IOException e){
  e.printStackTrace();
}

错误是NumberFormatException,在客户端接收文件的一部分作为fileSize的输入时,在第一个之后循环执行。

确保先flush PrintWriter ,然后再将原始字节直接写入与PrintWriter相连的OutputStream 否则,您可能会将所有缓冲区数据乱序写入基础套接字。

但更重要的是,请确保如果在接收端使用缓冲读取,则使用与接收文件名和文件大小相同的缓冲区读取文件字节。 您还应该使用较小的固定块传输File ,不要为整个文件大小分配单个byte[]数组,这会浪费大文件的内存,并且很可能会失败。

服务器:

try{
    byte[] bytes = new byte[1024];

    FileInputStream fis = new FileInputStream(file);
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);

    PrinterWriter pw = new PrintWriter(bos);
    pw.println(file.getName()); // Send Filename
    pw.println(file.length()); // Send filesize
    pw.flush();

    int count;
    while ((count = fis.read(bytes)) > 0) {
      bos.write(bytes, 0, count);
    }
    bos.flush();
    fis.close();
  }catch(IOException e){
    e.printStackTrace();
  }
}

客户:

try{
  byte [] buf  = new byte [1024];

  FileOutputStream fos = new FileOutputStream(file);
  InputStream is = socket.getInputStream();
  BufferedInputStream bis = new BufferedInputStream(is);

  InputStreamReader isr = new InputStreamReader(bis);
  String file = isr.readLine(); // Read filename
  long fileSize = Long.parseLong(isr.readLine()); // Read Filesize 

  int count = 0;
  while ((fileSize > 0) && (count = bis.read(buf, 0, (int)Math.min(buf.length, fileSize))) > 0){
    fos.write(buf, 0, count);
    fileSize -= count;
  }

  fos.close();
}catch(IOException e){
  e.printStackTrace();
}

话虽如此,您也可以考虑使用DataOutputStream.writeLong()DataInputStream.readLong()以原始二进制格式(而不是文本字符串DataInputStream.readLong()发送/接收文件大小:

服务器:

try{
    byte[] bytes = new byte[1024];

    FileInputStream fis = new FileInputStream(file);
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);

    PrinterWriter pw = new PrintWriter(bos);
    pw.println(file.getName()); // Send Filename
    pw.flush();

    DataOutputStream dos = new DataOutputStream(bos);
    dos.writeLong(file.length()); // Send filesize
    dos.flush();

    int count;
    while ((count = fis.read(bytes)) > 0) {
      bos.write(bytes, 0, count);
    }
    bos.flush();
    fis.close();
  }catch(IOException e){
    e.printStackTrace();
  }
}

客户:

try{
  byte [] buf  = new byte [1024];

  FileOutputStream fos = new FileOutputStream(file);
  InputStream is = socket.getInputStream();
  BufferedInputStream bis = new BufferedInputStream(is);

  InputStreamReader isr = new InputStreamReader(bis);
  String file = isr.readLine(); // Read filename

  DataInputStream dis = new DataInputStream(bos);
  long fileSize = dis.readLong(); // Read Filesize 

  int count = 0;
  while ((fileSize > 0) && (count = bis.read(buf, 0, (int)Math.min(buf.length, fileSize))) > 0){
    fos.write(buf, 0, count);
    fileSize -= count;
  }

  fos.close();
}catch(IOException e){
  e.printStackTrace();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM