【问题标题】:Can I do low level network programming in Java?我可以用 Java 进行低级网络编程吗?
【发布时间】:2013-07-19 06:47:03
【问题描述】:

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

【问题讨论】:

  • 1) 是否尝试过按相关关键字搜索 google? 2)为什么您认为这些软件包都不适用于您的场景?缺少这些细节的问题。
  • @Nambari:我有。我很困惑,因为一些关于 UDP 的资源似乎表明该操作是针对数据包的,而其他人则说 Java 不能在原始套接字中工作意味着它在更高的抽象级别上工作。我找不到我正在寻找的确切答案。
  • @Nambari:` 为什么你认为这些包都不适合你的场景?` 哪些包? net 包似乎在消息中起作用,而不是在数据包中
  • 是的,网络包。我建议用这些细节重新表述你的问题。这些详细信息将让社区知道您已经进行了一些研究并正在寻找特定信息。

标签: java sockets tcp network-programming udp


【解决方案1】:

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

在读取 TCP 时,您会以流的形式读取字节。您将不知道这些字节实际上是如何发送的。你可以读回 100 个字节,就你所知,它们可能已经发送了超过 10 个数据包。

没有 JNI 就无法在 java 中访问这些信息。当然,使用 JNI 你可以做任何事情:)

【讨论】:

  • 这与我的问题有什么关系?
  • 您问过 java 是否可以读取应用程序级别的数据包。答案是肯定的。它可以。让我详细说明。也许我误解了。我已经编辑解释您无法访问低级别的 TCP 数据包或低级别的 UDP 数据包。您只需在 UDP 中获得重新组装的数据包,以及用于 TCP 的流。
  • Java 提供 UDP 数据包访问,但我不相信它提供 TCP 数据包访问。如果你愿意的话,我想你可以用 UDP 实现 TCP。
  • TCP 不是基于 UDP 构建的。 TCP 建立在 IP 之上...@corsiKa
  • @WilliamMorrison:我问java是否可以ONLY在应用程序级别的数据包上工作。如果Application level messages operate in TCP/UDP layer yes? If so you can certainly do this in java则不行
【解决方案2】:

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

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

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

Pure 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) Pure Java can only see TCP streams. UDP 怎么样?我认为这一点意味着没有数据包访问 2) In most of these cases where I have seen this used it was a lot of work ?为什么。它只是一个图书馆,对吗?不行吗?
  • In most of these cases where I have seen this used it was a lot of work 我不想在 Java 中找到限制。我想看看我需要做的事情是否可以在Java 中完成,或者应该研究其他语言。不过我更喜欢Java
  • 我在jpcap 文档中读到它不能重塑流量,例如丢包等。为什么不能这样做?
  • 我已根据您的 cmets 添加了他的答案。 Java 5.0 于 2004 年发布。github.com/jpcap/jpcap 最后更新于 2011 年
  • +1 彻底的答案。我正要提到winpcap。在.net中使用过,很棒的东西。干得好。
【解决方案3】:

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

【讨论】:

  • 我可以在Java 中处理网络数据包的级别吗?我可以构建一个代理来塑造/过滤Java 中的流量吗?
  • @Jim 不,你不能,因为你不能在纯 Java 或 Java + JPcap 中过滤或抑制数据包。我不知道有任何基于 Java JNI 的库可以让你这样做。
  • 我最初在想一个代理,它接受客户端请求并读取数据包,但例如 not 将一些转发到实际目的地。这不是通过Java过滤吗?还是我很困惑?
  • 当然,您可以编写一个代理来做任何您喜欢的事情,但这与您提出的问题完全不同。代理使用特定的应用程序协议,并且至少为客户端所知。 “低级网络编程”意味着 IP 级别、数据包级别、对对等方的透明性等。
  • 客户端不需要知道代理运行的级别对吗?我的意思是,如果代理在IP 级别上运行,则客户端不会/不应该受到影响,并且仍然可以是http 客户端,对吧?
猜你喜欢
  • 2021-11-24
  • 2010-11-26
  • 1970-01-01
  • 2010-10-31
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多