Salta el contingut
 

Protocols de comunicació

Autor: Joan Puigcerver Ibáñez

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

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Introducció

Un protocol de comunicació és un conjunt de regles que defineix com s'intercanvia la informació entre diversos dispositius o aplicacions. Aquestes regles determinen la forma en què les dades s'estructuren per al seu enviament i recepció.

Normalment, cal tindre en compte els següents aspectes a l'hora de treballar amb un protocol o dissenyar-ne un:

  1. Tipus de missatge:

    • Decideix quins tipus de missatges seran necessaris per a la teua aplicació (peticions, respostes, notificacions, etc.).
    • Assigna identificadors únics (codis o noms) a cada tipus de missatge.
  2. Estructura del missatge: Defineix l'estructura de les dades per al seu enviament i recepció. Es poden utilitzar els següents formats:

    • Objectes Serialitzats: Objectes del llenguatge programació traduïts a binari (bytes).
    • Llenguatges de marques estructurats: Es poden utilitzar llenguatges de marques per estructurar la informació. Els formats més comuns i utilitzats en comunicació són JSON i XML.
  3. Autenticació i Autorització:

    • Defineix com es gestionarà l'autenticació dels clients.
    • Estableix mecanismes per gestionar permisos sobre quins clients tenen accés a quina informació.
  4. Gestió d'errors:

    • Defineix com es gestionaran els possibles errors durant la comunicació.
    • Pots utilitzar codis per indicar l'estat de cada missatge.
  5. Seqüencia:

    • Estableix una seqüència lògica per a les interaccions entre el client i el servidor.
    • Determina l'ordre en què es poden enviar i rebre els diferents tipus de missatges.

Una vegada dissenyat el protocol cal proporcionar una documentació detallada i completa que explique totes les possibles interaccions, la informació que es transmet i com s'ha de processar.

Protocol HTTP

El protocol de transferència d'hipertext o HTTP (HyperText Transfer Protocol) estableix el protocol per a l'intercanvi de documents d'hipertext i multimèdia al web. HTTP disposa d'una variant xifrada mitjançant SSL anomenada HTTPS. És el protocol utilitzat per la visualització de pàgines web.

Documentació

Especificació del protocol HTTP: https://www.w3.org/Protocols/Specs.html

Aquest protocol té una estructura client-servidor.

El protocol HTTP té diferents tipus de peticions. Els més comuns són:

  • GET: Sol·licita dades d'un recurs.
  • POST: Envia dades al servidor per processar-les.
  • PUT: Actualitza les dades d'un recurs o crea un nou recurs si no existeix.
  • DELETE: Elimina un recurs específic.

Documentació

Llista dels tipus de peticions completa: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

A més, HTTP utilitza una sèrie de codis per indicar si la petició efectuada s'ha pogut portar a terme i així, poder gestionar els errors correctament.

Alguns dels codis més comuns són:

  • 200: La sol·licitud ha tingut èxit.
  • 400: La sol·licitud no s'ha pogut processar perquè el servidor no ha entés la petició, segurament per algun error del client.
  • 404: Indica que la sol·licitud és vàlida però que el recurs sol·licitat no existeix.
  • 500: Indica que el servidor ha tingut algun error mentre processava la petició del client.
  • 503: Indica que s'ha denegat l'accés al recurs sol·licitat.

Documentació

Llista dels codis de resposta completa: https://developer.mozilla.org/es/docs/Web/HTTP/Status

Enviament d'objectes amb Java

Una de les maneres de poder enviar informació estructurada és mitjançant objectes serialitzats, és a dir, objectes del llenguatge de programació que han segut convertits a bytes.

Aquesta opció té l'avantatge que és molt còmoda, ja que pots enviar i rebre objectes directament sense la necessitat de processar el missatge. No obstant això, té l'inconvenient que la estructura dels objectes i la serialització depén del llenguatge de programació, per tant, és poc versàtil en el sentit que cal utilitzar el mateix llenguatge de programació per als clients i servidors.

Interfície Serializable

Abans que res, cal implementar la interfície Serializable en tots els objectes que s'utilitzaran en la comunicació.

Simplement cal implementar la interfície i no cal realitzar cap acció addicional en aquest pas. Amb això, Java ja sap com convertir l'objecte a binari.

Exemple

  • Objecte Request que implementa una petició o comunicació entre el servidor i el client.
  • Objecte RequestType que implementa els diferents tipus de peticions que hi haurà. Com que l'objecte Request conté un objecte RequestType, també cal serialitzar-lo.
Request.java
package ud3.examples.cinema.models;

import java.io.Serializable;

/**
 * Classe que representa una petició o resposta entre el servidor i el client.
 * <p>
 * Aquesta classe implementa Serialitzable per poder ser convertida a
 * bytes i poder ser enviada mitjançant sockets.
 */
public class Request implements Serializable {
    /**
     * Tipus de petició (GET/POST/SUCCESS/ERROR)
     * @see RequestType
     */
    private RequestType type;
    /**
     * Objecte que es pot adjuntar a la comunicació
     */
    private Object object;
    /**
     * Missatge opcional que es pot adjuntar a la comunicació
     */
    private String message;

    /**
     * Constructor de la petició
     * @param type Tipus de la petició
     * @param object Objecte adjuntat
     */
    public Request(RequestType type, Object object) {
        this.type = type;
        this.object = object;
    }

    /**
     * Constructor de la petició
     * @param type Tipus de la petició
     * @param object Objecte adjuntat
     * @param message Missatge adjuntat
     */
    public Request(RequestType type, Object object, String message) {
        this.type = type;
        this.object = object;
        this.message = message;
    }

    public RequestType getType() {
        return type;
    }

    public void setType(RequestType type) {
        this.type = type;
    }

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
RequestType.java
package ud3.examples.cinema.models;

import java.io.Serializable;

/**
 * Enumeració amb els diferents tipus de peticions que podem trobar
 * <p>
 * Aquesta classe implementa Serialitzable per poder ser convertida a
 * bytes i poder ser enviada mitjançant sockets.
 */
public enum RequestType implements Serializable {
    /**
     * El tipus GET s'utilitza per sol·licitar algun element del servidor
     */
    GET,
    /**
     * El tipus POST s'utilitza per enviar algun element al servidor
     */
    POST,
    /**
     * El tipus SUCCESS s'utilitza per indicar que l'acció s'ha dut a terme correctament
     */
    SUCCESS,
    /**
     * El tipus SUCCESS s'utilitza per indicar que l'acció no s'ha dut a terme correctament
     */
    ERROR
}

Enviament i recepció d'objectes

L'enviament i recepció d'objectes es gestionen amb les classes ObjectOutputStream i ObjectInputStream, que s'inicialitzaran amb el OutputStream o InputStream del Socket corresponent.

  • Enviament:

    ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputSteam());
    Request request = new Request(RequestType.POST, new Film("La vida es bella", 1997, 116))
    objOut.writeObject(request);
    

  • Recepció: En la recepció cal fer una conversió de tipus per poder obtindre l'objecte en el seu tipus corresponent, ja que el mètode readObject() retorna un Object.

    ObjectInputStream objin = new ObjectInputStream(socket.getInputStream());
    Request req = (Request) objIn.readObject();
    if(req.getType() == RequestType.POST)
        Film film = (Film) req.getObject();
    

Bibliografia

Comentaris