Rechnernetze / Kommunikationssysteme

Praktikum UDP-Programmierung

In diesem Versuch soll die Nutzung des UDP-Sockets in Java erprobt werden. Dazu soll analog zu dem bekannten Ping-Befehl ein Client programmiert werden, welcher Requests an einen Server versendet welcher die Request wiederum zurücksendet. Da mittels Java nicht direkt ICMP-Requests gesendet werden können, soll in diesem Praktikum das UDP-Protokoll verwendet werden.
Der Server ist bereits fertig implementiert. Sie müssen lediglich den dazu passenden Client programmieren. Da UDP lediglich einen unzuverlässigen Transport ermöglicht, sind Vorkehrungen auf der Anwendungsschicht bezüglich Fehlern zu treffen.
Um im Labor eine reale Internetverbindung zu simulieren, werden die Pakete vom Server künstlich um einen zufälligen Wert verzögert (AVERAGE_DELAY) und teilweise verworfen (LOSS_RATE). Testen Sie Ihren Client auf Funktionsfähigkeit mit verschiedenen Werten!
Der Aufruf des Servers erfolgt mittels:

java PingServer Portnummer

wobei eine Portnummer größer als 1023 gewählt werden sollte, um ohne Administratorrechte auszukommen.

Teil 1

Führen Sie als Einstieg und zum Testen der Abläufe bei der Java-Programmausführung das UDP-Beispiel aus der Vorlesung zum Thema Sockes aus (Klassen UDPClient und UDPServer).

Teil 2

Teil 3

Hinweise:

public class PingServer
{
   private static final double LOSS_RATE = 0.3;
   private static final int AVERAGE_DELAY = 100;  // milliseconds

   public static void main(String[] args) throws Exception
   {
      // Get command line argument.
      if (args.length != 1) {
         System.out.println("Required arguments: port");
         return;
      }
      int port = Integer.parseInt(args[0]);

      // Create random number generator for use in simulating 
      // packet loss and network delay.
      Random random = new Random();

      // Create a datagram socket for receiving and sending UDP packets
      // through the port specified on the command line.
      DatagramSocket socket = new DatagramSocket(port);

      // Processing loop.
      while (true) {
         // Create a datagram packet to hold incomming UDP packet.
         DatagramPacket request = new DatagramPacket(new byte[1024], 1024);

         // Block until the host receives a UDP packet.
         socket.receive(request);
         
         // Print the recieved data.
         printData(request);

         // Decide whether to reply, or simulate packet loss.
         if (random.nextDouble() < LOSS_RATE) {
            System.out.println("   Reply not sent.");
            continue; 
         }

         // Simulate network delay.
         Thread.sleep((int) (random.nextDouble() * 2 * AVERAGE_DELAY));

         // Send reply.
         InetAddress clientHost = request.getAddress();
         int clientPort = request.getPort();
         byte[] buf = request.getData();
         DatagramPacket reply = new DatagramPacket(buf, buf.length, clientHost, clientPort);
         socket.send(reply);

         System.out.println("   Reply sent.");
      }
   }

   /* 
    * Print ping data to the standard output stream.
    */
   private static void printData(DatagramPacket request) throws Exception
   {
      // Obtain references to the packet's array of bytes.
      byte[] buf = request.getData();

      // Wrap the bytes in a byte array input stream,
      // so that you can read the data as a stream of bytes.
      ByteArrayInputStream bais = new ByteArrayInputStream(buf);

      // Wrap the byte array output stream in an input stream reader,
      // so you can read the data as a stream of characters.
      InputStreamReader isr = new InputStreamReader(bais);

      // Wrap the input stream reader in a bufferred reader,
      // so you can read the character data a line at a time.
      // (A line is a sequence of chars terminated by any combination of \r and \n.) 
      BufferedReader br = new BufferedReader(isr);

      // The message data is contained in a single line, so read this line.
      String line = br.readLine();

      // Print host address and data received from it.
      System.out.println(
         "Received from " + 
         request.getAddress().getHostAddress() + 
         ": " +
         new String(line) );
   }
}

Fakultativ


Letzte Änderung: 24. October 2023 10:17