DatagramPacket 何时将其 IP 字段从 destinationIP 更改为 sourceIP?

When does a DatagramPacket have its IP field changed from destinationIP to sourceIP?

我正在尝试为一个项目熟悉 java 中的数据报系统,目前,我们只使用 UDP 包。

要发送消息,我们在 DatagramPacket 上设置目标 ip。

    /*
     * The fields of this class are package-private since
     * DatagramSocketImpl classes needs to access them.
     */
    byte[] buf;
    int offset;
    int length;
    int bufLength;
    InetAddress address;
    int port;

这样做,"address" 字段成为目标地址,但是当我们收到包裹时,该字段对应于源地址。

我认为对象本身不会通过网络发送,但它的信息会。

我已经简要检查了 DatagramPacket 和 DatagramSocket 的源代码,但似乎没有找到任何 "address" 字段被更改的实例。

我的猜测是DatagramPacket class只存储一个IP,因为另一个是机器的,当通过网络发送消息时,UDP包含两个IP,然后由DatagramSocket.receive() 并将丢失的(源)地址放在数据报上。对吗?

I think that the object itself is not sent on over the network, but its information is.

很明显!

Java 对象仅存在于 运行 Java 程序的上下文中。在 JVM 之外,它根本不存在。

因此,即使在不同 Java 应用程序之间发送序列化对象,您也不会真正发送对象。 (您实际上是在发送对象状态的表示,可以将其反序列化以提供 similar 对象。)


回到你的问题。当您发送数据报包时,您发送的不是 DatagramPacket 对象。 DatagramPacket 对象实际上是 缓冲区 ,其中包含您正在发送的数据包或您刚收到的数据包。

在您的情况下,您在不同机器上的不同 JVM 中有两个不同的 DatagramPacket 对象(可能)具有不同的 IP 地址。实际发生的是:

  • DatagramSocket::receive在收到数据报时将DatagramPacket的远程地址设置为收到的数据包的源IP;参见 javadoc
  • DatagramSocket::send 没有设置 DatagramPacket 的远程地址。相反,它将它用作数据报的目的地;参见 javadoc