Salta el contingut
 

Exemple: Comunicació amb Sockets

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Objectius

En aquest exemple es mostrarà 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:

  • 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. D'aquesta manera es realitzarà flush() automàticament després de cada print(). flush() força l'enviament de dades pel canal.

Després envia un missatge al servidor i espera un resposta d'aquest.

Per últim, 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 a que algun client es connecte i accepta la connexió. Aquesta connexió crea un Socket que ens permet comunicar-nos amb el client de la mateixa manera que ell amb nosaltres.

Comentaris