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
- Escriu un programa que enviï un missatge "Hola des de UDP!" a un altre programa que escolta en el port 1234.
- 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 elDatagramSocket
. - 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
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
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
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection