【问题标题】:Sending file from java socket to c ++ linux Socket将文件从java套接字发送到c ++ linux Socket
【发布时间】:2012-12-21 12:24:15
【问题描述】:

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

我需要它来做以下事情:

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

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

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

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

【问题讨论】:

  • 关键是,如果是大文件,分片发送。使用缓冲区以较小的部分读取/写入文件。如果这不是您想要的,您需要在您的问题中更加具体。
  • C++ 或 java 在这里不相关。问题是:两边都有一个套接字,并且双向发送数据。你必须设计一个协议,让你做你想做的事(就像 FTP 是一个示例协议来实现你似乎需要的东西)。然后你在两边都实现它,你就完成了。您可以查找示例协议并从中构建。
  • 如果Everything gets closed by "\n". 你有两个很大的限制。您不能发送二进制文件,也不能发送多于一行的文本。我会重新考虑协议。

标签: java c++ linux file sockets


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 为什么要实现 TCP/IP 协议栈固有的东西? IP 协议将您的数据分成数据包,TCP 协议进行握手和确认传输。
    • 你有一个关于打破它的观点;在某些情况下,我不会为此烦恼。至于握手:传输协议确实会确保数据包被传输并恢复到原来的顺序,但如果不是,它不一定会给应用程序带来有意义的错误。发送应用程序需要知道整个消息已正确接收,我认为最好通过从接收方向发送方发送确认来完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2011-08-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多