将文件从java套接字发送到c++ linux套接字
Sending file from java socket to c ++ linux Socket
我已经搜索了如何使用套接字在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(或一些编码)行结束每条消息。但是对于可能包含行尾字节作为有效数据的数据来说,这是不合适的。
在我看来,最简单的事情是发送每条消息中发送的字节数。除非有外部原因,否则我不会尝试在一条消息中发送整个文件;我会把文件分成"小块";我将定义一条消息,将特定块中的字节数作为第一个字节,然后发送块的其余部分,然后重复,直到所有块都发送完毕。
接收者显然必须知道字节数是发送的第一件事,它是多少字节,哪个字节(高或低顺序)是第一个,等等。接收方有足够的信息来读取所有的数据块并将它们重新组合在一起。
我还会包括一个"握手",即接收方在每个块之后返回一个消息,表明它收到了那个块;否则,您可能会花费大量时间发送字节,却发现您的接收器由于某种原因而关闭。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 了解是否接受套接字