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

时间:2013-07-19 20:52:27

标签: java sockets tcp network-programming udp

应用程序级别消息通过网络以一系列数据包发送,这些数据包在接收方汇编并传递到应用程序级别。
Java中是否可以在这些单独的数据包级别进行网络编程? 或者在Java我们只能看到“应用程序”级别的数据包?即所有这些网络数据包组装的“大数据包”? 我试图在google上研究此事,但结果真的令人困惑 令人困惑的原因是,一些关于UDP的资源似乎表明操作是在数据包上,而另一些则说Java无法在原始套接字中工作,这意味着它可以在更高的抽象级别上工作。我不能找到我正在寻找的答案。 如果是的话,这是哪个套餐呢?

3 个答案:

答案 0 :(得分: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文档中读到它无法重塑流量,例如丢包等为什么不能这样做?

您无法强制网络丢弃数据包,也无法欺骗内核删除数据包。如果你考虑丢弃的数据包是什么,答案是相当明显的。

答案 1 :(得分:0)

如果其他设备将您的大型UDP数据包分成较小的数据包,您将看不到分组化的段。

读取TCP时,您将读取字节作为流。你不知道这些字节是如何实际发送的。您可以读回100个字节,并且可以为您所知道的所有内容发送超过10个数据包。

没有JNI,没有办法在java中访问这些信息。当然,对于JNI,你可以做任何事情:)

答案 2 :(得分:0)

您似乎认为UDP == raw。它没有。原始== IP,甚至是以太网。 UDP是IP层,TCP也是如此。您无法在Java中使用原始套接字,但可以使用UDP和TCP。