Salta el contingut
 

Exemple: Comunicació amb Sockets

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Objectius

ud3.examples.create

Aquest exemple mostra com es poden crear programes que utilitzen objectes Socket i ServerSocket per comunicar-se entre ells.

Classe CreateClient

Codi font

CreateClient.java
package ud3.examples.create;

import java.io.*;
import java.net.ConnectException;
import java.net.Socket;

public class CreateClient {
    public static void main(String[] args) {
        try {
            System.out.println("Creant el Socket client.");
            Socket socket = new Socket("localhost", 1234);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // Es pot utilitzar l'opció autoflush
            PrintWriter out = new PrintWriter(socket.getOutputStream());

            String missatge = "Aquest missatge ha segut enviat des del client.";
            out.println(missatge);
            out.flush();
            System.out.println("S'ha enviat el missatge.");

            System.out.println("Esperant resposta");
            String resposta = in.readLine();

            System.out.println("Resposta del servidor:");
            System.out.println(resposta);

            System.out.println("Tancant el socket...");
            socket.close();
            System.out.println("Tancat");
        } catch (ConnectException e) {
            System.err.println("Connection refused!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Explicació

En aquest codi es crea un Socket que es connecta a un servidor, identificat per l'adreça IP host i el port. Una vegada connectat, es creen els objectes següents:

  • BufferedReader in: per llegir les dades del InputStream del Socket.
  • PrintWriter out: per escriure i enviar dades al OutputStream del Socket. És important utilitzar l'opció autoFlush en el constructor, perquè així es realitza flush() automàticament després de cada print(). El mètode flush() força l'enviament de dades pel canal.

Després, el client envia un missatge al servidor, espera la resposta i, finalment, tanca la connexió.

sequenceDiagram
    Client->>Servidor: Connexió
    Servidor-->>Client: Connexió acceptada
    Client->>Servidor: MISSATGE
    Servidor-->>Client: RESPOSTA

Classe CreateServer

Codi font

CreateServer.java
package ud3.examples.create;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.ServerSocket;
import java.net.Socket;

public class CreateServer {
    public static void main(String[] args) {
        try {
            int port = 1234;
            System.out.println("Creant el Socket servidor en el port: " + port);
            ServerSocket server = new ServerSocket( port);

            System.out.println("Esperant connexions...");
            Socket connexio = server.accept();
            System.out.println("Connectat amb el client!");

            BufferedReader in = new BufferedReader(new InputStreamReader(connexio.getInputStream()));
            PrintWriter out = new PrintWriter(connexio.getOutputStream());

            System.out.println("Esperant missatge des del client...");
            String missatge = in.readLine();
            System.out.println("Sha rebut el missatge:");
            System.out.println(missatge);

            System.out.println("S'ha enviat el missatge: \"Rebut!\"");
            out.println("Rebut!");
            out.flush();

            System.out.println("Tancant el servidor...");
            connexio.close();
            server.close();
            System.out.println("Tancat.");
        } catch (ConnectException e) {
            System.err.println("Connection refused!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Explicació

Aquest codi crea un servidor mitjançant ServerSocket, que escolta el port 1234. Després, espera que algun client es connecte i accepta la connexió. Aquesta connexió crea un Socket que permet comunicar-se amb el client de la mateixa manera que ell es comunica amb el servidor.

📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.