我已经搜索了如何使用套接字在linux中接收和发送文件的简洁解释,但我找不到一个解决方案,甚至工作一点。我有一个linux上的c++服务器和一个用java运行的客户端。
我需要它做以下事情:
- 客户端需要能够向服务器发送文本命令。
- 客户端需要能够向服务器发送/接收文件。
- 服务器接收到文件时得到以下命令:PUT
- 所有东西都以"n"关闭。
我已经写了很多代码,并且能够在客户端和服务器之间来回发送命令。但是现在我被困在客户端和服务器上发送/接收文件。
我应该采取什么步骤,才能从客户端接收到"PUT/map1/test.pdf somefile"的命令?并收到实际的文件?
如果需要代码,请询问,我会发布它,但我不知道哪些代码块可以帮助。
为什么不使用FTP服务器呢?毕竟,FTP就是为此而设计的。你可以在你的服务器上设置一个FTP守护进程,并使用Apache common.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编码的二进制文件数据。
套接字仅仅传输信息字节——它不知道这些字节是来自文件、消息还是随机生成的。这完全取决于发送和接收软件组织字节,以便接收方可以解释发送的字节。
通常对于简单的消息,发送者只是用ASCII(或一些编码)行结束每条消息。但是对于可能包含行尾字节作为有效数据的数据来说,这是不合适的。
在我看来,最简单的事情是发送每条消息中发送的字节数。除非有外部原因,否则我不会尝试在一条消息中发送整个文件;我会把文件分成"小块";我将定义一条消息,将特定块中的字节数作为第一个字节,然后发送块的其余部分,然后重复,直到所有块都发送完毕。
接收者显然必须知道字节数是发送的第一件事,它是多少字节,哪个字节(高或低顺序)是第一个,等等。接收方有足够的信息来读取所有的数据块并将它们重新组合在一起。
我还会包括一个"握手",即接收方在每个块之后返回一个消息,表明它收到了那个块;否则,您可能会花费大量时间发送字节,却发现您的接收器由于某种原因而关闭。