将文件从java socket发送到c ++ linux Socket

时间:2012-12-21 12:24:15

标签: java c++ linux file sockets

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

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

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

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

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

如果需要代码请问,我会发布,但我不知道哪些代码块可以提供帮助。

2 个答案:

答案 0 :(得分: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编码的二进制文件数据。

答案 1 :(得分:0)

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

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

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

接收器显然必须知道字节计数是发送的第一个字节,它是多少字节,哪个字节(高或低顺序)是第一个等等。然后接收器有足够的信息阅读所有的块并将它们放回原处。

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