Lab - Aplikacje UDP

UDP (User Datagram Protocol) to lekki, bezpołączeniowy protokół komunikacyjny, w którym dane przesyłane są w postaci pojedynczych pakietów – datagramów. W przeciwieństwie do TCP, UDP nie gwarantuje dostarczenia ani kolejności pakietów, ale dzięki temu jest szybszy i świetnie nadaje się do transmisji multimediów, gier online czy systemów czasu rzeczywistego.

W języku Java do obsługi połączeń UDP wykorzystywane są głównie klasy:

  • DatagramSocket – gniazdo UDP, służy do wysyłania i odbierania datagramów.

  • DatagramPacket – pojedynczy pakiet danych.

Przykłąd - serwer UDP

Podstawowym rozwiązaniem za pomocą, którego możemy stworzyć instancje serwera, która będzie rozgłaszać pakiety jest wykorzytsanie klasy DataSocket.

import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        int port = 9876;

        try (DatagramSocket serverSocket = new DatagramSocket(port)) {
            byte[] receiveBuffer = new byte[1024];

            System.out.println("Serwer UDP nasłuchuje na porcie " + port);

            while (true) {
                DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
                serverSocket.receive(receivePacket); // odbiór pakietu

                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Otrzymano: " + message);

                // wysłanie odpowiedzi do klienta
                InetAddress clientAddress = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();
                String response = "Serwer otrzymał: " + message;
                byte[] sendBuffer = response.getBytes();

                DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, clientAddress, clientPort);
                serverSocket.send(sendPacket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Przykład - klient UDP

import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        String serverHost = "localhost";
        int serverPort = 9876;

        try (DatagramSocket clientSocket = new DatagramSocket()) {
            InetAddress serverAddress = InetAddress.getByName(serverHost);

            String message = "Cześć, serwerze UDP!";
            byte[] sendBuffer = message.getBytes();

            // wysłanie pakietu
            DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, serverAddress, serverPort);
            clientSocket.send(sendPacket);

            // odbiór odpowiedzi
            byte[] receiveBuffer = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
            clientSocket.receive(receivePacket);

            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Odpowiedź serwera: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Różnice między UDP a TCP

Cecha
TCP
UDP

Typ połączenia

Połączeniowy (connection-oriented)

Bezpołączeniowy (connectionless)

Kolejność danych

Gwarantowana

Nie gwarantowana

Niezawodność

Wysoka (kontrola błędów, retransmisje)

Niska (brak potwierdzeń)

Szybkość

Wolniejszy (narzut protokołu)

Bardzo szybki

Zastosowania

WWW, e-mail, FTP

VoIP, streaming, gry online

Zadania

  1. Napisz prosty serwer UDP, który odsyła odebraną wiadomość w odwrotnej kolejności.

  2. Rozszerz klienta UDP tak, aby wysyłał wiadomości w pętli (np. co sekundę).

  3. Sprawdź, co się stanie, gdy:

    • serwer nie działa,

    • klient poda błędny port,

    • wysłane dane będą większe niż rozmiar bufora.

  4. Skorzystaj z obiektów JSON i przygotuj aplikację serwerową tak aby rozsyłała informacje w postaci JSON-a, a klient odpowiednio je odbierała i wyświetlał na ekran.

  5. Stwórz aplikację, którą będzie działać na zasadzie "broadcast-u" i rozsyłać wiadomości do wszystkich, któryż w danym momencie nasłuchują. Stwórz rozwiązanie, które pozwoli identyfikować użytkowników i wywołać do wszystkich z pominięciem nadawcy.

Last updated