Отправка и получение пакетов UDP с использованием Java? - программирование
Подтвердить что ты не робот

Отправка и получение пакетов UDP с использованием Java?

Я сделал программу для отправки UDP-пакетов от клиента к серверу, вот код передатчика

import java.io.IOException;
import java.net.*;

/**
 *
 * @author hp
 */
public class JavaApplication9 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws UnknownHostException, SocketException, IOException  {
        // TODO code application logic here
        byte[] buffer = {10,23,12,31,43,32,24};
        byte [] IP={-64,-88,1,106};
        InetAddress address = InetAddress.getByAddress(IP);
        DatagramPacket packet = new DatagramPacket(
                buffer, buffer.length, address, 57
                );
        DatagramSocket datagramSocket = new DatagramSocket();
        datagramSocket.send(packet);
        System.out.println(InetAddress.getLocalHost().getHostAddress());


    }
}

Функция кода приемника

public void run(){

    try{
        DatagramSocket serverSocket = new DatagramSocket(port);
        byte[] receiveData = new byte[8];
        byte[] sendData = new byte[8];

        while(true)
           {
              DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
              serverSocket.receive(receivePacket);
              String sentence = new String( receivePacket.getData());
              System.out.println("RECEIVED: " + sentence);
              InetAddress IPAddress = receivePacket.getAddress();
              String sendString = "polo";
              sendData = sendString.getBytes();
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
              serverSocket.send(sendPacket);
           }
    }catch (Exception e){
    }
}

Я использовал программу WireShark. Пакет UDP принимается в программе WireShark в приемнике, но программа Java не распознает его, программа просто продолжает слушать порт, и ничего не происходит?

4b9b3361

Ответ 1

Приемник должен установить порт приемника для соответствия порту, установленному в отправителе DatagramPacket. Для отладки попробуйте прослушивать порт > 1024 (например, 8000 или 9000). Порты < 1024 обычно используются системными службами и требуют доступа администратора для привязки к такому порту.

Если приемник отправляет пакет на жестко закодированный порт, который он прослушивает (например, порт 57), а отправитель находится на одном компьютере, тогда вы создадите loopback для самого ресивера. Всегда используйте порт, указанный в пакете, и в случае программного обеспечения для производства потребуется проверка в любом случае, чтобы предотвратить такой случай.

Другая причина, по которой пакет не попадет в пункт назначения, - это неправильный IP-адрес, указанный в отправителе. UDP в отличие от TCP попытается отправить пакет, даже если адрес недоступен, и отправитель не получит индикацию ошибки. Вы можете проверить это, напечатав адрес в приемнике в качестве меры предосторожности для отладки.

В отправителе, который вы установили:

 byte [] IP= { (byte)192, (byte)168, 1, 106 };
 InetAddress address = InetAddress.getByAddress(IP);

но может быть проще использовать адрес в строковой форме:

 InetAddress address = InetAddress.getByName("192.168.1.106");

Другими словами, вы устанавливаете цель как 192.168.1.106. Если это не приемник, вы не получите пакет.

Вот простой приемник UDP, который работает:

import java.io.IOException;
import java.net.*;

public class Receiver {

    public static void main(String[] args) {
        int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
        new Receiver().run(port);
    }

    public void run(int port) {    
      try {
        DatagramSocket serverSocket = new DatagramSocket(port);
        byte[] receiveData = new byte[8];

        System.out.printf("Listening on udp:%s:%d%n",
                InetAddress.getLocalHost().getHostAddress(), port);     
        DatagramPacket receivePacket = new DatagramPacket(receiveData,
                           receiveData.length);

        while(true)
        {
              serverSocket.receive(receivePacket);
              String sentence = new String( receivePacket.getData(), 0,
                                 receivePacket.getLength() );
              System.out.println("RECEIVED: " + sentence);
              // now send acknowledgement packet back to sender     
              InetAddress IPAddress = receivePacket.getAddress();
              String sendString = "polo";
              byte[] sendData = sendString.getBytes("UTF-8");
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
                   IPAddress, receivePacket.getPort());
              serverSocket.send(sendPacket);
        }
      } catch (IOException e) {
              System.out.println(e);
      }
      // should close serverSocket in finally block
    }
}