【问题标题】:Infinite loop when trying to transfer a file using JAva sockets [duplicate]尝试使用 JAva 套接字传输文件时出现无限循环 [重复]
【发布时间】:2025-12-05 14:25:01
【问题描述】:

我正在尝试用 Java 传输一个 XML 文件,但是接收该文件的客户端死在一个无限循环中,我不知道如何解决它。


我用来发送文件的代码是:

FileInputStream fileInputStream = new FileInputStream(new File("file.xml"));
byte[] buffer = new byte[socket.getSendBufferSize()];
int bytesRead = 0;
while((bytesRead = fileInputStream.read(buffer)) > 0)
{
    out.write(buffer, 0, bytesRead);
}
out.flush();
fileInputStream.close();

我用来接收文件的代码是:

byte[] mybytearray = new byte[1024];
File file = new File("file.xml");
FileOutputStream fileOutputStream= new FileOutputStream(file);
int bytesRead = 0;
while((bytesRead = in.read(mybytearray, 0, mybytearray.length)) > 0);
{
    fileOutputStream.write(mybytearray, 0, bytesRead);
}
fileOutputStream.close();

你能帮帮我吗?

谢谢!

【问题讨论】:

  • 你关闭连接/套接字吗?
  • a) 在这里看不到与套接字有任何关系。 b) 接收样本中的“in”是什么? c) 使用 IOUtils 而不是自己编写呢?
  • 私有 ObjectInputStream in = = new ObjectInputStream(socket.getInputStream());私有 ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
  • 我没有关闭连接,因为它在 Android 应用程序的所有活动之间共享。
  • 那么你的接收者将不知道文件是完整的,因此它会阻塞并且没有完成。如果您想保持连接打开,您必须发送文件的大小,以便接收者知道您何时完成。但有一件事,我认为让连接保持打开状态并不是一个好主意......

标签: java file sockets tcp transfer


【解决方案1】:

接收方不知道数据何时完成,因此接收方在从套接字读取数据时被阻塞,直到超时。 两种解决方案:

  1. 先发送size并读取足够的数据(与size相同),然后关闭跳出读取的socket。

  2. xml文件发送完成后,发送EOF表示文件完成,读取EOF时跳出。

【讨论】:

  • 在您的应用程序中,您可以制定规则。即在 SMTP 中,\n.\n 表示邮件内容的结尾。
  • @TonyZhu:发送原始 XML 文件会使使用分隔符有点困难。不知道 xml 文件中有什么。
  • @grieve 是第二种解决方案,如果很难使用分隔符,我认为建议第一种解决方案。
  • 如果您要发送 XML,它已经是自定界的。 EOF 不需要另一个应用程序协议。
最近更新 更多