发送多个文件 - 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)。
我在两个设备之间发送文件,所以我建立了套接字通信。现在,我只是想发送一个文件,但将来我想发送多个文件(由用户从 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)。