【发布时间】:2011-02-17 12:46:19
【问题描述】:
我正在研究 TCP 套接字,我需要在 Java 中创建 TCP 数据包,以便我可以通过网络逐个数据包传输我的文件数据包,它还可以帮助我在数据包中添加一些额外的信息。
有可能吗?如果可以,请提供任何例子吗?
提前致谢
【问题讨论】:
-
为什么要重新发明轮子?当您写入
SocketOutputStream时,数据包分段由操作系统和 Java 为您处理。
我正在研究 TCP 套接字,我需要在 Java 中创建 TCP 数据包,以便我可以通过网络逐个数据包传输我的文件数据包,它还可以帮助我在数据包中添加一些额外的信息。
有可能吗?如果可以,请提供任何例子吗?
提前致谢
【问题讨论】:
SocketOutputStream 时,数据包分段由操作系统和 Java 为您处理。
这是一个很奇怪的要求,我很怀疑你……真的……需要这样做。
让我们从您似乎提议的方式开始尝试实现的目标:
...通过网络传输我的文件 [...],它还可以帮助我添加一些附加信息 [...] 以及数据。
因此,您希望将文件与一些附加数据/元数据一起传输。目前尚不清楚元数据是否需要嵌入文件数据中,但我不明白为什么,所以我假设不需要。 (但实际上并没有太大区别。)
以下是一些可能的方法:
使用 FTP 协议传输文件和元数据。文件和元数据可以被视为一个单元(例如,在 ZIP 存档中)或单独的文件。您可以安排它,使其成为客户端到服务器或服务器到客户端的传输。您可以使用现成的客户端和服务器软件。 FTPS 是一种更安全的替代方案。
使用 HTTP 协议传输文件和元数据。文件和元数据可以被视为一个单元(例如 MIME 多部分文档)或单独的文档。与 FTP 一样休息。 HTTPS 是一种更安全的替代方案。
您可以创建一个在 TCP/IP 连接上运行的自定义协议,在您想要的任何端口上运行。您可以以任何您想要的方式对文件和元数据进行编码和传输。为提高安全性,请使用 SSL/TLS over TCP/IP 连接。
您可以将文件分割成小块并通过 UDP 作为“数据包”发送。您必须自己处理检测和从数据包丢失中恢复的细节。不建议这样做。
您可以(理论上)使用 JPCAP 在原始网络数据包上实现 TCP/IP 或 UDP/IP。然后在您刚刚创建的 TCP/IP 或 UDP/IP 堆栈上运行上述之一。这是一个非常糟糕的主意。这是大量(不必要的)工作。这可能会导致您的应用程序甚至整个本地网络出现可靠性问题。
如果有特殊原因导致 HTTP 和 FTP 协议不适合您,我建议使用 1. 或 2. 选项,如果有特殊原因,可以使用 3. 作为替代方案。
(如果你真的想做 5。那么如果你能找到任何使用 JPCAP 实现的 TCP/IP 示例,我会感到非常惊讶。这个想法太疯狂了......)
【讨论】:
ObjectOutputStream.reset()。你为什么不把这个作为一个新问题来问?包括相关代码和异常堆栈跟踪。
您可以使用JPCAP 来构造原始 TCP 数据包,但我想问如果目的是传输文件,您为什么需要这样做。要传输文件,对于 99% 以上的用例,您无需逐包确定它是如何传输的。
【讨论】:
如果您想控制单个数据包,那么 TCP 对您来说肯定是错误的协议 - 看看 UDP。 (这可以通过 Java 中的 DatagramSocket 或 DatagramChannel 访问。)
对于 TCP,您只需一个字节流(或者实际上,两个流 - 一个发送 OutputStream 和一个接收 InputStream),而不必关心 TCP 实现发送的底层数据包。
【讨论】: