java - 我可以用 Java 进行低级网络编程吗?

标签 java sockets tcp network-programming udp

应用层消息以一系列数据包的形式通过网络发送,这些数据包在接收端组装并传递到应用层。
Java 中是否可以在这些单独的数据包级别进行网络编程?
或者在 Java 中我们只能看到“应用程序”级别的数据包? IE。由所有这些网络数据包组装而成的“大数据包”?
我试着在谷歌上研究这个问题,但结果真的很困惑。
混淆是由于一些关于 UDP 的资源似乎表明操作是在数据包上进行的,而其他人则说 Java 不能在原始套接字中工作,这意味着它在更高的抽象级别上工作。我不能找到我正在寻找的答案。 如果是,哪个包执行此操作?

最佳答案

Is it possible in Java to do network programming in the level of these individual packets?

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

Or in Java we can only see the "application" level packet?

Pure Java 只能看到 TCP 流,以及与数据包具有一对一映射的 UDP 数据报,但您无法访问 UDP header 。

I.e. the "big-packet" that is assembled by all these network packets?

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

If yes, which package does this?

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

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

在我所见的大多数情况下,这种做法都是徒劳无益的。

from my point of view an answer mentioning JNI means that Java does not support it (since you have to actually code in another language for what you need)

Sockets、Files、GUI组件最终都使用了JNI。根据这个定义,你不能做任何使用 Java 系统调用的事情,因为操作系统不是用 Java 编写的。

我不认为这是一个有用的定义,说明您可以在 Java 中做什么。

1) Pure Java can only see TCP streams. What about UDP?

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

I assume this point means no packet access

并非没有任何额外的库。

2) In most of these cases where I have seen this used it was a lot of work ? Why.

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

It is just a library right?

正确。

Doesn't it work?

为什么这么说?

I am trying to see if what I need to do can be done in Java or should look into other languages.

恕我直言,您不会发现使用其他语言更容易。

I read in the jpcap docs that it can not reshape traffic e.g. drop packets etc. Why can't it do that?

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

关于java - 我可以用 Java 进行低级网络编程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17755297/

相关文章:

architecture - Stevens 的 TCP/IP 插图图形

java - 收到消息时通知如何工作

c - 通过 epoll 处理监听套接字

java - 通过套接字将字节流数组转换为位图图像失败

python - 使用Python Select()接收数据的重大延迟

java - 软件电话/voip上有任何源代码或教程吗?

java - 使用 Id Autowiring tcp-outbound-channel-adapter 不起作用

java - 如何在 O(n) 中找到两个链表之间缺少的元素?

java - 在 swing 问题中编写 GUI

Java 集合缩减为 Map