Java中的数据包创建?

3

我正在研究TCP套接字,需要用Java创建TCP数据包以便逐个包地通过网络传输文件,同时也可以在数据中添加一些附加信息。

这是否可行?如果是,您可以提供任何示例吗?

先谢谢了。


1
为什么要重复造轮子?当你写入SocketOutputStream时,数据包的分段由操作系统和Java自动处理。 - Mark Peters
3个回答

1

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


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堆栈上运行其中之一。这是一个非常糟糕的想法。这是大量(不必要的)工作。它可能会导致您的应用程序以及整个本地网络的可靠性问题。

我建议选项1或2最好,如果HTTP和FTP协议不能满足您的需求,则选项3是一种替代方案。
(如果您真的想要做第5个选项,那么我会非常惊讶,因为我很难相信您能找到使用JPCAP实现TCP/IP的任何示例。这个想法太疯狂了...)

嗨,史蒂芬,谢谢你的回复...实际上我需要使用TCP套接字进行工作。我尝试创建一个类,以便我可以向其每个对象写入1024字节的数据,并使用ObjectOutputStream传输它,但是当我尝试在循环中读取对象时,它抛出了异常。 - Jinith
如果您有关于在套接字上连续写入和读取对象的传输示例,请分享。这将非常有帮助。 - Jinith
我没有例子。但我怀疑你只需要在每个“数据包”之间调用ObjectOutputStream.reset()。为什么不将其作为一个新问题提出来呢?请包括相关的代码和异常堆栈跟踪。 - Stephen C

0

如果你想要对单个数据包进行控制,那么TCP绝对不是适合你的协议 - 请看看UDP。(在Java中可以通过DatagramSocket或DatagramChannel访问。)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接