web-dev-qa-db-fra.com

envoyer et recevoir des paquets UDP en utilisant Java?

J'ai créé un programme pour envoyer des paquets UDP d'un client vers un serveur voici le code de l'émetteur

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());


    }
}

La fonction de code récepteur est

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){
    }
}

J'ai utilisé le programme WireShark. Le paquet UDP est reçu dans le programme WireShark au niveau du récepteur mais le programme Java ne le reconnaîtrait pas, le programme continue d'écouter le port et rien ne se passe?

18

Le récepteur doit définir le port du récepteur pour correspondre au port défini dans l'expéditeur DatagramPacket. Pour le débogage, essayez d'écouter sur le port> 1024 (par exemple 8000 ou 9000). Les ports <1024 sont généralement utilisés par les services système et nécessitent un accès administrateur pour se lier à un tel port.

Si le récepteur envoie un paquet au port codé en dur qu'il écoute (par exemple le port 57) et que l'expéditeur se trouve sur la même machine, vous créerez un bouclage vers le récepteur lui-même. Utilisez toujours le port spécifié dans le paquet et en cas de logiciel de production, vous aurez besoin d'une vérification dans tous les cas pour éviter un tel cas.

Une autre raison pour laquelle un paquet n'atteindra pas la destination est la mauvaise adresse IP spécifiée dans l'expéditeur. UDP contrairement à TCP tentera d'envoyer un paquet même si l'adresse est inaccessible et l'expéditeur ne recevra pas d'indication d'erreur. Vous pouvez le vérifier en imprimant l'adresse dans le récepteur par mesure de précaution pour débogage.

Dans l'expéditeur, vous définissez:

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

mais il pourrait être plus simple d'utiliser l'adresse sous forme de chaîne:

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

En d'autres termes, vous définissez la cible sur 192.168.1.106. Si ce n'est pas le récepteur, vous n'obtiendrez pas le paquet.

Voici un récepteur UDP simple qui fonctionne:

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];
        String sendString = "polo";
        byte[] sendData = sendString.getBytes("UTF-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();
              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
    }
}
30
JasonM1