gpt4 book ai didi

java - BufferedInputStream 挂起(未到达文件末尾)

转载 作者:行者123 更新时间:2023-12-02 04:49:52 28 4
gpt4 key购买 nike

我有 Java SSL/TLS 服务器和客户端套接字。我的客户端只需将文件发送到服务器,服务器就会接收它。这是我的代码:

我的客户端方法:

static boolean writeData(BufferedOutputStream bos, File data) {
FileInputStream fis = new FileInputStream(data);
BufferedInputStream bis = new BufferdInputStream(fis);

byte[] bytes = new byte[512];
int count = 0;
while ((count = bis.read(bytes, 0, bytes.length)) > 0) {
System.out.println("Sending file...");
bos.write(dataByte, 0, count);
System.out.println(count);
}
bos.flush();
System.out.println("File Sent");
}

我的服务器方法:

static boolean receiveData(BufferedInputStream bis, File data) {

byte[] bytes = new byte[512];
int count = 0;
while ((count = bis.read(bytes, 0, bytes.length)) > 0) {
System.out.println("Receiving file...");
// Do something..
System.out.println(count);
}
bos.flush();
System.out.println("File Received");
}

问题是,服务器卡在 while 循环内。它永远不会到达“文件已接收”消息。

即使文件很小,bis.read() 方法也不会由于某种原因在文件末尾返回 -1。我以16字节的文件大小测试了这些方法,输出如下:

客户端:

> Sending file...
> 16
> File Sent

服务器终端:

> Receiving file...
> 16

正如您所看到的,即使到达流末尾,服务器也永远不会到达“文件已接收”消息并挂起在循环内。有人能猜出其中的原因吗?

谢谢

最佳答案

您的服务器永远不会检测到文件已发送,因为它会检查您是否已关闭另一端的连接(这是您收到 -1 字节读取的唯一原因)。

但是你永远不会关闭连接,你只会刷新它。

writeData 方法中的 bos.flush() 替换为 bos.close() ,它应该可以工作。

<小时/>

如果你不想关闭连接,因为你想用它做更多的工作,你必须添加某种协议(protocol),因为没有默认的方法来做到这一点。

您可以做的一件事是在文件之前将文件的长度作为 32 位或 64 位整数发送,这是实现此目的的更简单方法之一。/p>

然后服务器知道在认为文件已完全发送之前应该读取多少字节。

<小时/>

如果您不知道文件的长度,有很多选择。我不确定是否就最有效的方法达成了共识,但考虑到许多协议(protocol)采用不同的方法,我认为还没有达成共识。

这些只是一些建议,您可以进行调整。

  1. 在任何数据之前,您可以将要发送的数据的长度作为 32 位(有符号)整数发送。因此一个文件将作为多条数据发送。发送负数意味着前一 block 是最后一 block ,文件已经结束。 (如果您需要发送的数据 block 大于您可以用有符号 32 位整数表示的最大值,则需要将其拆分为多个数据 block )。
  2. 您可以考虑一个随机数,其长度足够长(例如 16 字节或 32 字节),它永远不会出现在您的数据中。您可以在文件之前发送该号码,并且当文件完成后,您可以再次发送该号码以指示该事件。这与 MIME 多部分编码类似。
  3. 您可以使用一个字节或多个字节来指示文件是否已结束(例如 0xFF)。但为了确保您仍然可以合法地发送 0xFF 作为文件的一部分,您添加了规则:0xFF 0xFF 表示文件已结束,但 0xFF 0x00 表示文件中“只是一个文字 0xFF”。
  4. 还有很多方法可以做到这一点。

关于java - BufferedInputStream 挂起(未到达文件末尾),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324954/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com