Els sockets són una eina fonamental per a la comunicació en xarxa en Java. Permeten que dos programes, ja sigui en la mateixa màquina o en màquines diferents, es comuniquin entre si. En aquest tema, aprendrem què són els sockets, com funcionen i com podem utilitzar-los en Java per crear aplicacions de xarxa.
Què és un Socket?
Un socket és un punt final d'una connexió de comunicació bidireccional entre dos programes que s'executen en una xarxa. Els sockets permeten que les aplicacions enviïn i rebin dades a través de la xarxa.
Tipus de Sockets
- Sockets de Flux (Stream Sockets): Utilitzen el protocol TCP (Transmission Control Protocol) per a la comunicació fiable i orientada a connexió.
- Sockets de Datagram (Datagram Sockets): Utilitzen el protocol UDP (User Datagram Protocol) per a la comunicació no fiable i sense connexió.
Creació d'un Socket en Java
Importació de Paquets Necessaris
Per treballar amb sockets en Java, necessitem importar els següents paquets:
Creació d'un Client Socket
Un client socket és utilitzat per connectar-se a un servidor i enviar o rebre dades.
Exemple de Client Socket
import java.io.*; import java.net.*; public class ClientSocketExample { public static void main(String[] args) { String serverAddress = "127.0.0.1"; // Adreça IP del servidor int port = 12345; // Port del servidor try (Socket socket = new Socket(serverAddress, port)) { // Enviar dades al servidor PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hola, servidor!"); // Rebre dades del servidor BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String response = in.readLine(); System.out.println("Resposta del servidor: " + response); } catch (IOException e) { e.printStackTrace(); } } }
Creació d'un Server Socket
Un server socket és utilitzat per escoltar connexions entrants dels clients.
Exemple de Server Socket
import java.io.*; import java.net.*; public class ServerSocketExample { public static void main(String[] args) { int port = 12345; // Port en el qual el servidor escoltarà try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Servidor escoltant en el port " + port); while (true) { // Acceptar connexions entrants Socket clientSocket = serverSocket.accept(); System.out.println("Client connectat: " + clientSocket.getInetAddress()); // Rebre dades del client BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String message = in.readLine(); System.out.println("Missatge del client: " + message); // Enviar resposta al client PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); out.println("Hola, client!"); // Tancar la connexió amb el client clientSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } }
Exercicis Pràctics
Exercici 1: Crear un Client i un Servidor
- Objectiu: Crear un client i un servidor que es comuniquin entre si.
- Descripció: El client enviarà un missatge al servidor, i el servidor respondrà amb un missatge de confirmació.
Solució
Client.java
import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { String serverAddress = "127.0.0.1"; int port = 12345; try (Socket socket = new Socket(serverAddress, port)) { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hola, servidor!"); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String response = in.readLine(); System.out.println("Resposta del servidor: " + response); } catch (IOException e) { e.printStackTrace(); } } }
Servidor.java
import java.io.*; import java.net.*; public class Servidor { public static void main(String[] args) { int port = 12345; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Servidor escoltant en el port " + port); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("Client connectat: " + clientSocket.getInetAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String message = in.readLine(); System.out.println("Missatge del client: " + message); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); out.println("Hola, client!"); clientSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } }
Exercici 2: Ampliar la Comunicació
- Objectiu: Ampliar la comunicació entre el client i el servidor per permetre múltiples missatges.
- Descripció: El client i el servidor han de poder enviar i rebre múltiples missatges fins que un d'ells enviï "exit".
Solució
Client.java
import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { String serverAddress = "127.0.0.1"; int port = 12345; try (Socket socket = new Socket(serverAddress, port); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) { String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); if ("exit".equalsIgnoreCase(userInput)) { break; } System.out.println("Resposta del servidor: " + in.readLine()); } } catch (IOException e) { e.printStackTrace(); } } }
Servidor.java
import java.io.*; import java.net.*; public class Servidor { public static void main(String[] args) { int port = 12345; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Servidor escoltant en el port " + port); while (true) { try (Socket clientSocket = serverSocket.accept(); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) { String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("Missatge del client: " + inputLine); if ("exit".equalsIgnoreCase(inputLine)) { break; } out.println("Resposta del servidor: " + inputLine); } } catch (IOException e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } }
Resum
En aquest tema, hem après què són els sockets i com utilitzar-los en Java per crear aplicacions de xarxa. Hem vist exemples pràctics de com crear un client i un servidor que es comuniquin entre si, i hem practicat amb exercicis per reforçar els conceptes apresos. Els sockets són una eina poderosa per a la comunicació en xarxa i són essencials per a moltes aplicacions modernes.
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