it-swarm.com.de

Senden und Empfangen von UDP-Paketen mit Java?

Ich habe ein Programm erstellt, um ein UDP-Paket von einem Client an einen Server zu senden. Hier ist der Sendercode

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


    }
}

Die Empfängercodefunktion ist

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

Ich habe das WireShark-Programm verwendet. Das UDP-Paket wird im WireShark-Programm des Empfängers empfangen, aber das Java) -Programm erkennt es nicht, das Programm hört einfach weiter auf den Port und es passiert nichts?

18

Der Empfänger muss den Port des Empfängers so einstellen, dass er mit dem im DatagramPacket des Absenders festgelegten Port übereinstimmt. Probieren Sie zum Debuggen Port> 1024 (z. B. 8000 oder 9000) aus. Ports <1024 werden normalerweise von Systemdiensten verwendet und benötigen Administratorzugriff, um an einen solchen Port gebunden zu werden.

Wenn der Empfänger ein Paket an den fest codierten Port sendet, den er abhört (z. B. Port 57), und der Absender sich auf demselben Computer befindet, würden Sie eine Schleife zum Empfänger selbst erstellen. Verwenden Sie immer den aus dem Paket angegebenen Port und im Falle einer Produktionssoftware müsste in jedem Fall eine Überprüfung durchgeführt werden, um einen solchen Fall zu verhindern.

Ein weiterer Grund, warum ein Paket nicht ans Ziel gelangt, ist die falsche IP-Adresse, die im Absender angegeben wurde. UDP im Gegensatz zu TCP wird versuchen, ein Paket zu senden, auch wenn die Adresse nicht erreichbar ist und der Absender keine Fehlermeldung erhält. Sie können dies überprüfen, indem Sie vorsichtshalber die Adresse im Empfänger ausdrucken Debuggen.

Im Absender setzen Sie:

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

möglicherweise ist es jedoch einfacher, die Adresse in Form einer Zeichenfolge zu verwenden:

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

Mit anderen Worten, Sie legen das Ziel als 192.168.1.106 fest. Wenn dies nicht der Empfänger ist, erhalten Sie das Paket nicht.

Hier ist ein einfacher UDP-Empfänger, der funktioniert:

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