-1

我已经搜索了如何使用套接字在 linux 中接收和发送文件的简洁解释,但我找不到一个甚至可以工作的解决方案。我在 linux 上有一个 c++ 服务器,还有一个在 java 中运行的客户端。

我需要它来执行以下操作:

  • 客户端需要能够向服务器发送文本命令。
  • 客户端需要能够向服务器发送/接收文件。
  • 服务器在接收文件时获取以下命令:PUT < saveLocation > < filecontents >
  • 一切都被“\ n”关闭。

我已经编写了很多代码,并且能够在客户端和服务器之间来回发送命令。但现在我被困在客户端和服务器上发送/接收文件。

我应该采取哪些步骤,才能从客户端接收“PUT /map1/test.pdf somefile”命令并接收实际文件?

如果需要代码,请询问,我会发布它,但我不知道哪些代码块会有所帮助。

4

2 回答 2

1

为什么不使用 FTP 服务器呢?毕竟,FTP 就是为此而设计的。您可以在您的服务器上设置一个 FTP 守护程序并使用 Apache commons-net 的FTPClient 。

如果您一心想重新发明轮子,那么 MIME 多部分方法(通过 HTTP 发布文件或在电子邮件中作为附件发送时使用)是定义一个边界,然后对二进制文件内容进行 BASE64 编码以便能够将其作为 ASCII 文本发送。

边界应该是一串足够复杂的文本,以便唯一。你的“交易”看起来像

PUT <filename> boundary=A_COMPLEX_BOUNDARY_STRING<newline>
<BASE64 encoded binary file content>A_COMPLEX_BOUNDARY_STRING

在服务器上接收时,您解析文件名、边界值,然后您知道边界字符串的第一个换行符之后的所有内容都是 BASE64 编码的二进制文件数据。

于 2012-12-21T12:41:22.903 回答
0

套接字仅传输信息字节——它不“知道”这些字节是来自文件、消息还是随机生成的。完全由发送和接收软件来组织字节,以便接收者可以解释发送的字节。

通常对于简单的消息,发件人只需以 ASCII(或某种编码)行尾结束每条消息。但这不适用于可能包含行尾字节作为有效数据的数据。

在我看来,最简单的事情是发送每条消息中发送的字节数。除非有外部原因,否则我不会尝试在一条消息中发送整个文件;我会将文件分成“块”;我会定义一条消息,将特定块中的字节数作为第一个字节,然后发送块的其余部分,然后重复直到发送所有块。

接收器显然必须知道字节数是第一个发送的,它是多少字节,哪个字节(高位或低位)是第一个等等。然后接收器有足够的信息来读取所有块并将它们重新组合在一起。

我还将包括一个“握手”,即接收者在每个块之后返回一条消息,表明它收到了那个;否则,您可能会花费大量时间发送字节,却发现您的接收器由于某种原因已关闭。

于 2012-12-21T12:59:01.083 回答