我正在研究TCP套接字,需要用Java创建TCP数据包以便逐个包地通过网络传输文件,同时也可以在数据中添加一些附加信息。
这是否可行?如果是,您可以提供任何示例吗?
先谢谢了。
这是一个非常奇怪的请求,我非常怀疑你真的需要这样做。
让我们从你似乎打算采取的方式来看你想要实现什么:
......通过网络传输我的文件[...],同时也可以帮助我添加一些附加信息[...]与数据一起。
所以你想要传输一个文件和一些额外的数据/元数据。不清楚元数据是否需要嵌入到文件数据中,但我认为不需要。 (但这真的没有太大关系。)
以下是一些可能的方法:
使用FTP协议传输文件和元数据。文件和元数据可以作为一个单元(例如在ZIP归档中)或作为单独的文件进行处理。您可以将其安排为客户端到服务器或服务器到客户端的传输。您可以使用现成的客户端和服务器软件。FTPS是更安全的选择。
使用HTTP协议传输文件和元数据。文件和元数据可以作为一个单元(例如MIME多部分文档)或作为单独的文档进行处理。其余与FTP相同。HTTPS是更安全的选择。
您可以创建一个自定义协议,通过TCP/IP连接运行在任何端口上。您可以以任何方式对文件和元数据进行编码和传输。为了更安全,使用SSL/TLS over TCP/IP连接。
您可以将文件分成小块并作为“数据包”通过UDP发送。您必须自己处理检测和恢复数据包丢失的细节。这不是推荐的方法。
理论上,您可以使用JPCAP在原始网络数据包上实现TCP/IP或UDP/IP。然后在刚刚创建的TCP/IP或UDP/IP堆栈上运行其中之一。这是一个非常糟糕的想法。这是大量(不必要的)工作。它可能会导致您的应用程序以及整个本地网络的可靠性问题。
ObjectOutputStream.reset()
。为什么不将其作为一个新问题提出来呢?请包括相关的代码和异常堆栈跟踪。 - Stephen C如果你想要对单个数据包进行控制,那么TCP绝对不是适合你的协议 - 请看看UDP。(在Java中可以通过DatagramSocket或DatagramChannel访问。)
对于TCP,你只需要一个字节流(实际上有两个流 - 发送OutputStream和接收InputStream),而不必关心TCP实现发送的底层数据包。
SocketOutputStream
时,数据包的分段由操作系统和Java自动处理。 - Mark Peters