【问题标题】:Sending file with custom attributes over a network通过网络发送具有自定义属性的文件
【发布时间】:2011-06-29 08:21:16
【问题描述】:

我想创建一个客户端-服务器程序,允许客户端将文件连同有关文件的一些信息(发件人姓名、描述等)发送到服务器。

该文件可能非常大,因为它可能是文本、图片、音频或视频文件,因此我不想在发送之前将整个文件读入字节数组,我宁愿以块的形式读取文件,通过网络发送它们,然后允许服务器将块附加到文件的末尾。

但是,我面临的问题是如何最好地发送文件以及有关文件本身的一些信息。我希望至少发送发件人的姓名和描述,这两者都将由用户输入到客户端程序,但这可能会在未来发生变化,因此应该灵活。

有什么好的方法可以让我“流式传输”正在发送的文件,而不是将其作为一个整体读取然后发送?

【问题讨论】:

  • 你说的是网络应用吗?如果您运行 Web 应用程序,为什么不使用 HTTP POST 发送文件和参数?是的,您可以将流发送到您的 Web 应用程序。
  • @gigadot 客户端和服务器以及在台式计算机上运行的 Swing 应用程序。

标签: java networking file-upload file-transfer


【解决方案1】:

套接字本身就是字节流,所以你不应该有问题。我建议你有一个看起来像这样的协议。

这将允许您发送任意属性,只要总长度小于 64 KB。后面是可以是任何 63 位长度的文件,并且一次发送一个块。 (使用 8 KB 的缓冲区)

如果您愿意,可以使用 Socket 发送更多文件。

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
Properties fileProperties = new Properties();
File file = new File(filename);

// send the properties
StringWriter writer = new StringWriter();
fileProperties.store(writer, "");
writer.close();
dos.writeUTF(writer.toString());

// send the length of the file
dos.writeLong(file.length());

// send the file.
byte[] bytes = new byte[8*1024];
FileInputStream fis = new FileInputStream(file);
int len;
while((len = fis.read(bytes))>0) {
    dos.write(bytes, 0, len);
}
fis.close();
dos.flush();

阅读

DataInputStream dis = new DataInputStream(socket.getInputStream());
String propertiesText = dis.readUTF();
Properties properties = new Properties();
properties.load(new StringReader(propertiesText));
long lengthRemaining = dis.readLong();
FileOutputStream fos = new FileOutputStream(outFilename);
int len;
while(lengthRemaining > 0 
   && (len = dis.read(bytes,0, (int) Math.min(bytes.length, lengthRemaining))) > 0) {
      fos.write(bytes, 0, len);
      lengthRemaining -= len;
}
fos.close();

【讨论】:

  • 谢谢,我就是这么想的,但我不确定接收端将如何处理传输。您能否为此提供一些示例代码?
  • 大体相同。无论如何添加。
【解决方案2】:

您可以围绕众所周知的 FTP 协议构建程序。 要发送元信息,您只需创建一个包含信息的唯一名称的特殊文件。然后通过 FTP 传输用户文件和元文件。

否则,再次使用 FTP 文件,您可以在您的手写程序的客户端-服务器流中传输元数据。

【讨论】:

    【解决方案3】:

    我建议为此使用 http 协议。服务器可以使用 servlet 实现,Apache HttpClient 可以用于客户端。 This article 有一些很好的例子。您可以在同一个请求中同时发送文件和参数。而且代码很少!

    【讨论】:

    • 谢谢,有没有办法在没有 servlet 的情况下使用这种方法?这两个应用程序都适用于标准台式机
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多