我正在用Java编写一个通过套接字双向发送文件的类它在GitHub上。在文件接收完成之前,一切都很好。不久:
client.java中的- 是C:\Maven\README.txt的硬编码方式
- 首先我发送文件名
- 然后我发送文件长度
- 在第三步中,我将文件从FileInputStream发送到DataOutputStream
在客户端:
byte[] bytes = new byte[(int)forSend.length()];
InputStream fin = new FileInputStream(forSend);
int count;
while ((count = fin.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
fin.close();
fout = new FileOutputStream(filename);
byte[] bytes = new byte[length];
System.out.println("receiving file...");
int count;
while ((count = in.read(bytes)) > 0) {
fout.write(bytes, 0, count);
}
fout.flush();
fout.close();
服务器上的- 文件已完全接收(长度和内容相同(
当我试图添加代码以在之后向套接字中写入内容时,启动后服务器和客户端正在等待一些内容(我不知道是什么(
以前我遇到过这种情况,丢失了一个DataInputStream读取(消息从服务器发送,但客户端上没有收到此消息(。但目前我正在尝试添加在文件传输完成后更改的标志,并在稍后检查其状态。它在服务器和客户端上都可以工作,但添加从/到Socket的读/写会让我回到服务器和客户端都在等待的情况。
现在怎么了?
我的朋友Denr01帮助了我,所以我的错误是控制了文件长度,我的问题根本没有。正因为如此,我的"完成"确认被写入了文件。解决问题的方法是在发送方:
int read = 0;
int block = 8192;
int count = 0;
byte[] bytes = new byte[block];
while (read != forSend.length()) {
count = fin.read(bytes, 0, block);
out.writeInt(count);
out.write(bytes, 0, count);
read += count;
System.out.println("already sent " + read + " bytes of " + forSend.length());
}
- 发送方读取字节并写入字节计数
- 它将计数发送给reciver,所以reciver将知道在当前循环迭代中要接收多少字节
- 然后Sender发送字节块并递增读取的字节计数器
- 计数器不等于文件长度时重复此操作
发件人:
int block = 8192;
int count = 0;
int read = 0;
byte[] bytes = new byte[block];
System.out.println("recieving file...");
while (read != length) {
block=in.readInt();
in.readFully(bytes, 0, block);
fout.write(bytes, 0, block);
read += block;
System.out.println("already recieved " + read + " bytes of " + length);
}
- 制作长度等于发送方块长度的字节数组
- 在每次迭代中,首先读取下一个块长度,然后读取此字节计数
- 递增累加器计数器
- 当计数器不等于以前收到的文件长度时重复此操作
在这种情况下,我们可以控制每个文件读取迭代,并始终知道要接收多少字节,因此当接收的所有字节都相同时,文件将不会写入下一个"消息"。