Когда DatagramPacket меняет свое поле IP с targetIP на sourceIP? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь ознакомиться с системой дейтаграмм в java для проекта, в настоящее время мы работаем только с пакетами UDP.

Чтобы отправить сообщение, мы установили IP-адрес назначения в DatagramPacket.

    /*
     * 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;

При этом поле «адрес» становится адресом назначения, но когда мы получаем пакет, это поле соответствует источнику.

Я думаю, что сам объект не отправляется напо сети, но его информация есть.

Я кратко проверил исходный код DatagramPacket и DatagramSocket, но, похоже, не нашел ни одного экземпляра, где было изменено это поле "address".

Я предполагаю, что только класс DatagramPacketхранит один IP-адрес, потому что другой является IP-адресом машины, и когда сообщение отправляется по сети, UDP содержит оба IP-адреса, которые затем обрабатываются DatagramSocket.receive () и помещают отсутствующий (исходный) адрес в дейтаграмму.Это правильно?

1 Ответ

1 голос
/ 19 мая 2019

Я думаю, что сам объект не передается по сети, но его информация есть.

Очевидно!

Объект Java существует только в контексте работающей программы Java.За пределами JVM его просто не существует.

Так что даже при отправке сериализованного объекта между различными приложениями Java вы не действительно отправляете объект.(Вы на самом деле отправляете представление о состоянии объекта, которое можно десериализовать, чтобы получить подобный объект.)


Вернуться к вашему вопросу.Когда вы отправляете пакет дейтаграммы, вы не отправляете объект DatagramPacket.DatagramPacket объекты на самом деле являются буферами , которые содержат либо пакет, который вы отправляете, либо пакет, который вы только что получили.

В вашем случае у вас есть два различных DatagramPacketобъекты в разных JVM на разных машинах с (предположительно) разными IP-адресами.На самом деле происходит следующее:

  • DatagramSocket::receive устанавливает для удаленного адреса DatagramPacket исходный IP-адрес полученного пакета при получении дейтаграммы;см. javadoc .
  • DatagramSocket::send не устанавливает удаленный адрес DatagramPacket.Вместо этого он использует его как место назначения для дейтаграммы;см javadoc .
...