Java套接字文件传输-文件不完整
从服务器到客户端的文件传输有问题。问题是,即使文件有多大,最后的字节也不会被传输。假设我想下载一个56kb的文件,那么我只收到35kb的文件 我将为您提供一些代码片段,也许有人可以看到任何错误 发件人:Java套接字文件传输-文件不完整,java,file,sockets,Java,File,Sockets,从服务器到客户端的文件传输有问题。问题是,即使文件有多大,最后的字节也不会被传输。假设我想下载一个56kb的文件,那么我只收到35kb的文件 我将为您提供一些代码片段,也许有人可以看到任何错误 发件人: public void sendFile(String fileName, Socket socket) { try { try { File transferFile = new File(fileName); byte[
public void sendFile(String fileName, Socket socket) {
try {
try {
File transferFile = new File(fileName);
byte[] bytearray = new byte[(int) transferFile.length()];
FileInputStream fin = new FileInputStream(transferFile);
BufferedInputStream bin = new BufferedInputStream(fin);
OutputStream os = socket.getOutputStream();
int bytesRead = 0;
while (-1 != (bytesRead = bin.read(bytearray, 0, bytearray.length))) {
os.write(bytearray, 0, bytesRead);
}
bin.close();
os.flush();
socket.close();
} catch (IOException e) {
System.out.println("error " + e);
}
} catch (Exception ex) {
System.out.println("error " + ex);
}
}
接收人:
public void downloadFile(Socket socket, String fName) {
try {
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(fName);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int count;
byte[] buffer = new byte[1024];
while ((count = is.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
} catch (Exception e) {
System.out.println("Error " + e);
}
}
欢迎提供任何帮助,谢谢。而((count=is.read(buffer))>0)
将在is.read()返回零时中断循环
但是,如果返回零,则不应假定已到达文件末尾,因为根据文档,零是一个完全有效的返回值
您应该一直阅读,直到返回-1
此外,在关闭缓冲输出流bos
后,您还应该关闭文件输出流fos
那么,您是否一直收到不完整的文件?您想用新代码修改您的问题吗?现在发生的是,如果在循环的一次迭代中读取0字节,那么在该迭代中将写入0字节。这可能不是错误,但也不是一个好主意。无论如何,我已经修改了关于需要关闭FileOutputStream
的回答。通常,最好先在不使用缓冲的情况下让事情正常工作,然后,如果需要,引入BufferedOutputStream
。只有在缓冲区长度为零或第三个参数提供了零计数时,才能返回零。在出现这样的错误时,您几乎不想旋转循环。请查看此帖子和该帖子中的链接:&在发件人处使用固定长度的缓冲区。无需将其与文件长度关联。1025AS在您的接收代码中是相当充分的,尽管较大的代码不会有什么坏处。