2012-12-21 65 views
-1

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

我需要做以下几点:

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

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

我应该采取哪些步骤,以便能够从客户端收到一条命令,其中提示“PUT /map1/test.pdf somefile” 并且还会收到实际的文件?

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

+0

关键是,如果它是一个大文件,将文件分段发送。使用缓冲区以较小的部分读取/写入文件。如果这不是你想要的,你需要在你的问题中更具体。 –

+0

C++或java在这里不相关。问题是:你在双方都有一个套接字,并且你以两种方式发送数据。你必须设计一个协议,允许你做你想做的事情(就像FTP是一个实现你所需要的协议一样)。然后你在双方都实现它,你就完成了。您可以查找示例协议并从中进行构建。 – Mic

+0

如果“所有东西都被\ n”。“关闭了,您有两个很大的限制。您无法发送二进制文件,也无法使用多行发送文本。我会重新考虑这个协议。 –

回答

0

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

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

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

接收者显然必须知道字节数是第一个发送的数据,它有多少字节,哪个字节(高或低的顺序)是第一个,等等。接收机然后有足够的信息读取所有块并将它们放回到一起。我也会包括一个“握手”,即接收者在每个块之后都会返回一个消息,指示它接收到了这个消息;否则,您可能会花费大量时间发送字节,以便发现您的接收器由于某种原因而关闭。

+0

你为什么要实现TCP/IP协议栈本身的东西? IP协议会将您的数据分解为数据包,TCP协议将握手并确认传输。 – pap

+0

你有一个关于分手的观点;有些情况下我不会为此而烦恼。至于握手:传输协议的确会确保数据包被传输并恢复到原来的顺序,但是如果不是的话,它不一定会给应用程序带来有意义的错误。发送应用程序需要知道整个邮件的接收是否正确,并且我认为最好通过从接收方向发送方发回确认来完成。 – arcy

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数据。