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

  1. Sockets de Flux (Stream Sockets): Utilitzen el protocol TCP (Transmission Control Protocol) per a la comunicació fiable i orientada a connexió.
  2. 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:

import java.io.*;
import java.net.*;

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

  1. Objectiu: Crear un client i un servidor que es comuniquin entre si.
  2. 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ó

  1. Objectiu: Ampliar la comunicació entre el client i el servidor per permetre múltiples missatges.
  2. 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

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