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
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
Napisz prosty serwer UDP, który odsyła odebraną wiadomość w odwrotnej kolejności.
Rozszerz klienta UDP tak, aby wysyłał wiadomości w pętli (np. co sekundę).
Sprawdź, co się stanie, gdy:
serwer nie działa,
klient poda błędny port,
wysłane dane będą większe niż rozmiar bufora.
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.
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