我可以用Java进行底层网络编程吗?

Jim*_*Jim 5 java sockets udp network-programming tcp

应用程序级别消息以一系列数据包的形式在网络上发送,这些数据包在接收方组装并传递到应用程序级别。
是否可以在Java这些单个数据包级别进行网络编程?
还是在Java我们只能看到“应用程序”级别的数据包?是所有这些网络数据包组装的“大数据包”吗?
我试图在谷歌上对此事进行研究,但结果确实令人困惑。
造成这种混乱的原因是,有关UDP的某些资源似乎表明该操作是在数据包上进行的,而另一些资源则表示Java无法在原始套接字中工作,这意味着它可以在更高的抽象层上工作。找到确切的答案我正在寻找。如果是,请问是哪个包装?

Pet*_*rey 2

在Java中是否可以在这些单独的数据包级别上进行网络编程?

是的,但是您不太可能想要单独的数据包。

或者在Java中我们只能看到“应用程序”级别的数据包?

纯Java只能看到TCP流和UDP数据报,它们与数据包具有一对一的映射,但您无法访问UDP标头。

即由所有这些网络数据包组装而成的“大数据包”?

你不会收到大大小小的数据包。您读取数据并读取可用数据(最多可达缓冲区的大小)

如果是,哪个包执行此操作?

您可以使用 JPcap 查看各个数据包,但是,除非您需要每个数据包的准确时间戳或需要跟踪丢弃的数据包,否则这很少有用。

这通过 JNI 使用 winpcap (Windows) 或 libpcap (linux)。

在我见过的大多数情况下,这种方法的使用都是大量的工作却收效甚微。

从我的角度来看,提到 JNI 的答案意味着 Java 不支持它(因为你必须实际用另一种语言编写你需要的代码)

套接字、文件、GUI 组件最终都使用 JNI。根据这个定义,您不能执行任何使用 Java 中的系统调用的操作,因为操作系统不是用 Java 编写的。

我认为这对于 Java 中的功能来说不是一个有用的定义。

1)纯Java只能看到TCP流。那么UDP呢?

如果没有 libPCap,您将无法使用 Java 中的任何协议访问数据包的标头。

我认为这一点意味着没有数据包访问

并非没有任何额外的库。

2)在我见过的大多数情况下,这需要做很多工作吗?为什么。

因为它的级别非常低,而且很多你通常不必担心的细节都会暴露给你。注意:您可能不会收到数据包,因为在尝试记录它们时它们可能会被丢弃,并且您将无法再次请求它们,因此您会错过它们。

这只是一个图书馆吧?

正确的。

不起作用吗?

为什么这么说?

我想看看我需要做的事情是否可以用 Java 完成,或者应该考虑其他语言。

恕我直言,你不会发现用另一种语言更容易。

我在 jpcap 文档中读到它不能重塑流量,例如丢弃数据包等。为什么它不能这样做?

你不能强迫网络丢弃数据包,也不能欺骗内核丢弃数据包。如果您考虑一下什么是丢包,答案就相当明显了。