发送多个文件 - byte[] 缓冲区中每个文件的结尾

Sending multiple files - end of each file in the byte[] buffer

我在两个设备之间发送文件,所以我建立了套接字通信。现在,我只是想发送一个文件,但将来我想发送多个文件(由用户从 gridview 中选择)。

问题是当我发送一个文件时,在服务器端(接收文件)socket.getInputStream().read(buffer) 没有检测到文件的结尾。它只是等待 "more" 数据被发送。

在对这个问题进行了一些搜索之后,我找到了一些主题,这些主题给了我一些选择,但我仍然对它不满意,因为我不知道这些选项是否可以有效地发送多个文件。这是一个例子:How to identify end of InputStream in java

我可以在发送文件后关闭套接字或流对象,但如果我想发送大量文件,总是关闭和打开套接字效率不高。

接收器上的代码:

  File apkReceived = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/testeReceiveServerComm.apk");
  byte[] buffer = new byte [8192];
  FileOutputStream fos=new FileOutputStream(apkReceived);
  int count=0;
  int total=0;//so apra ir vendo quanto recebi.
  while((count = in.read(buffer)) != -1){
        fos.write(buffer,0,count);
        total+=count;
        System.out.println("Server Comm receive thread - already received this ammount : "+total);

  }

客户端(发送方)上的代码:

  File apkToSend=new File(filePath);
  byte[] buffer = new byte [8192];
  BufferedInputStream bis=new BufferedInputStream(new FileInputStream(apkToSend));
  int count;
  int total=0; 
  while((count=bis.read(buffer))!=-1){
         out.write(buffer,0,count);
         total+=count;
         out.reset();
         System.out.println("send thread - already sent this ammount : "+total);
            }

            out.flush();
            bis.close();

您正在读取套接字,直到 read() returns -1。这是流结束条件 (EOS)。 EOS 在对等方关闭连接时发生。不是当它写完一个文件时。

您需要在每个文件之前发送文件大小。您已经对文件计数做了类似的事情。然后确保您准确读取了该文件的字节数:

这是示例代码

String filename = dis.readUTF();
long fileSize = dis.readLong();
FileOutputStream fos = new FileOutputStream(filename);
while (fileSize > 0 && (n = dis.read(buf, 0, (int)Math.min(buf.length, fileSize)) != -1)
{
  fos.write(buf,0,n);
  fileSize -= n;
}
fos.close();

您可以将所有这些包含在一个循环中,该循环在 readUTF() 抛出 EOFException 时终止。相反,当然,在发送数据之前,您必须在发件人处调用 writeUTF(filename) 和 writeLong(filesize)。