【问题标题】:Packet creation in java?在java中创建数据包?
【发布时间】:2011-02-17 12:46:19
【问题描述】:

我正在研究 TCP 套接字,我需要在 Java 中创建 TCP 数据包,以便我可以通过网络逐个数据包传输我的文件数据包,它还可以帮助我在数据包中添加一些额外的信息。

有可能吗?如果可以,请提供任何例子吗?

提前致谢

【问题讨论】:

  • 为什么要重新发明轮子?当您写入SocketOutputStream 时,数据包分段由操作系统和 Java 为您处理。

标签: java sockets packet


【解决方案1】:

这是一个很奇怪的要求,我很怀疑你……真的……需要这样做。

让我们从您似乎提议的方式开始尝试实现的目标:

...通过网络传输我的文件 [...],它还可以帮助我添加一些附加信息 [...] 以及数据。

因此,您希望将文件与一些附加数据/元数据一起传输。目前尚不清楚元数据是否需要嵌入文件数据中,但我不明白为什么,所以我假设不需要。 (但实际上并没有太大区别。)

以下是一些可能的方法:

  1. 使用 FTP 协议传输文件和元数据。文件和元数据可以被视为一个单元(例如,在 ZIP 存档中)或单独的文件。您可以安排它,使其成为客户端到服务器或服务器到客户端的传输。您可以使用现成的客户端和服务器软件。 FTPS 是一种更安全的替代方案。

  2. 使用 HTTP 协议传输文件和元数据。文件和元数据可以被视为一个单元(例如 MIME 多部分文档)或单独的文档。与 FTP 一样休息。 HTTPS 是一种更安全的替代方案。

  3. 您可以创建一个在 TCP/IP 连接上运行的自定义协议,在您想要的任何端口上运行。您可以以任何您想要的方式对文件和元数据进行编码和传输。为提高安全性,请使用 SSL/TLS over TCP/IP 连接。

  4. 您可以将文件分割成小块并通过 UDP 作为“数据包”发送。您必须自己处理检测和从数据包丢失中恢复的细节。不建议这样做。

  5. 您可以(理论上)使用 JPCAP 在原始网络数据包上实现 TCP/IP 或 UDP/IP。然后在您刚刚创建的 TCP/IP 或 UDP/IP 堆栈上运行上述之一。这是一个非常糟糕的主意。这是大量(不必要的)工作。这可能会导致您的应用程序甚至整个本地网络出现可靠性问题。

如果有特殊原因导致 HTTP 和 FTP 协议不适合您,我建议使用 1. 或 2. 选项,如果有特殊原因,可以使用 3. 作为替代方案。

(如果你真的想做 5。那么如果你能找到任何使用 JPCAP 实现的 TCP/IP 示例,我会感到非常惊讶。这个想法太疯狂了......)

【讨论】:

  • 您好 Stephenthanx 来回回复...实际上我需要使用 tcp 套接字。我尝试创建一个类,以便我可以将 1024 字节的数据写入其每个对象并使用 objectoutputstream 传输它,但是当我尝试循环读取对象时它抛出异常。
  • 如果您有任何通过套接字传输对象的好例子,包括不断写入和读取套接字上的对象,请分享。会有很大帮助
  • 我没有例子。但我怀疑你只需要在每个“数据包”之间调用ObjectOutputStream.reset()。你为什么不把这个作为一个新问题来问?包括相关代码和异常堆栈跟踪。
【解决方案2】:

您可以使用JPCAP 来构造原始 TCP 数据包,但我想问如果目的是传输文件,您为什么需要这样做。要传输文件,对于 99% 以上的用例,您无需逐包确定它是如何传输的。

【讨论】:

    【解决方案3】:

    如果您想控制单个数据包,那么 TCP 对您来说肯定是错误的协议 - 看看 UDP。 (这可以通过 Java 中的 DatagramSocket 或 DatagramChannel 访问。)

    对于 TCP,您只需一个字节流(或者实际上,两个流 - 一个发送 OutputStream 和一个接收 InputStream),而不必关心 TCP 实现发送的底层数据包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 2011-01-15
      • 2010-10-02
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2012-06-04
      • 2015-06-19
      相关资源
      最近更新 更多