En aquest tema, explorarem com utilitzar les classes DatagramSocket i DatagramPacket per a la comunicació de xarxa basada en el protocol UDP (User Datagram Protocol). A diferència del protocol TCP, UDP és un protocol sense connexió que no garanteix la lliurament dels paquets, però és més ràpid i eficient per a certes aplicacions.

Conceptes Clau

  • UDP (User Datagram Protocol): Protocol de comunicació sense connexió que envia datagrames sense establir una connexió prèvia.
  • DatagramSocket: Classe que representa un punt final per enviar i rebre datagrames.
  • DatagramPacket: Classe que representa un datagrama que es pot enviar o rebre a través d'un DatagramSocket.

Creació d'un DatagramSocket

Exemple de Codi

import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPExample {
    public static void main(String[] args) {
        try {
            // Crear un DatagramSocket en un port específic
            DatagramSocket socket = new DatagramSocket(9876);
            System.out.println("Socket creat en el port 9876");
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

Explicació

  • DatagramSocket socket = new DatagramSocket(9876);: Crea un DatagramSocket que escolta en el port 9876. Si el port està ocupat o no es pot utilitzar, es llençarà una excepció SocketException.

Enviament de Datagrames

Exemple de Codi

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSender {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket();
            String message = "Hola, món!";
            byte[] buffer = message.getBytes();
            InetAddress address = InetAddress.getByName("localhost");
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);
            socket.send(packet);
            System.out.println("Missatge enviat");
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicació

  • DatagramSocket socket = new DatagramSocket();: Crea un DatagramSocket sense especificar un port, el sistema operatiu assignarà un port disponible.
  • byte[] buffer = message.getBytes();: Converteix el missatge en un array de bytes.
  • InetAddress address = InetAddress.getByName("localhost");: Obté l'adreça IP de l'host "localhost".
  • DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);: Crea un DatagramPacket amb el missatge, la longitud del missatge, l'adreça de destinació i el port de destinació.
  • socket.send(packet);: Envia el paquet a través del socket.

Recepció de Datagrames

Exemple de Codi

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiver {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(9876);
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            System.out.println("Esperant missatge...");
            socket.receive(packet);
            String receivedMessage = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Missatge rebut: " + receivedMessage);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicació

  • DatagramSocket socket = new DatagramSocket(9876);: Crea un DatagramSocket que escolta en el port 9876.
  • byte[] buffer = new byte[1024];: Crea un buffer per emmagatzemar el datagrama rebut.
  • DatagramPacket packet = new DatagramPacket(buffer, buffer.length);: Crea un DatagramPacket per rebre el datagrama.
  • socket.receive(packet);: Espera a rebre un datagrama i l'emmagatzema en el paquet.
  • String receivedMessage = new String(packet.getData(), 0, packet.getLength());: Converteix el contingut del datagrama rebut en una cadena de text.

Exercicis Pràctics

Exercici 1: Enviar i Rebre un Missatge

  1. Escriu un programa que enviï un missatge "Hola des de UDP!" a un altre programa que escolta en el port 1234.
  2. Escriu un programa que escolti en el port 1234 i imprimeixi el missatge rebut.

Solució

Enviador:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSender {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket();
            String message = "Hola des de UDP!";
            byte[] buffer = message.getBytes();
            InetAddress address = InetAddress.getByName("localhost");
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 1234);
            socket.send(packet);
            System.out.println("Missatge enviat");
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Receptor:

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiver {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(1234);
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            System.out.println("Esperant missatge...");
            socket.receive(packet);
            String receivedMessage = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Missatge rebut: " + receivedMessage);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Errors Comuns i Consells

  • Port Ocupat: Si el port ja està en ús, es llençarà una excepció SocketException. Assegura't que el port estigui disponible abans de crear el DatagramSocket.
  • Adreça IP Incorrecta: Si l'adreça IP no és vàlida o no es pot resoldre, es llençarà una excepció UnknownHostException. Verifica que l'adreça IP sigui correcta.
  • Buffer Massa Petit: Si el buffer és massa petit per emmagatzemar el datagrama rebut, es perdrà part del missatge. Assegura't que el buffer sigui prou gran per al missatge esperat.

Conclusió

En aquest tema, hem après com utilitzar les classes DatagramSocket i DatagramPacket per enviar i rebre datagrames utilitzant el protocol UDP. Hem vist exemples pràctics de com crear sockets, enviar missatges i rebre'ls, així com alguns errors comuns i consells per evitar-los. Amb aquests coneixements, estàs preparat per implementar comunicacions de xarxa eficients i ràpides en les teves aplicacions Java.

Curs de Programació en Java

Mòdul 1: Introducció a Java

Mòdul 2: Flux de Control

Mòdul 3: Programació Orientada a Objectes

Mòdul 4: Programació Orientada a Objectes Avançada

Mòdul 5: Estructures de Dades i Col·leccions

Mòdul 6: Gestió d'Excepcions

Mòdul 7: Entrada/Sortida de Fitxers

Mòdul 8: Multithreading i Concurrència

Mòdul 9: Xarxes

Mòdul 10: Temes Avançats

Mòdul 11: Frameworks i Llibreries de Java

Mòdul 12: Construcció d'Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats