Salta el contingut
 

Pràctica 3: Sòcols i serveis

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Entrega

L'entrega ha de complir els requisits següents:

  • Paquet: el codi ha d'estar en el paquet corresponent: ud3.practices
  • Nom de la classe: la classe on comença l'execució (main()) de cada exercici té com a nom el títol de l'exercici.
  • Format de l'eixida: ha de ser consistent amb el format demanat.
  • Lliurament: un fitxer .zip amb el contingut del paquet.
  • Repositori: el codi ha d'estar pujat a GitHub, al teu repositori del mòdul.
  • Etiqueta de GitHub: PracticeSocket ( Create a tag in a GitHub repository – StackOverflow).

LyricsApp

ud3.practices.lyrics

Adapta el codi de la Pràctica 2 (LyricsApp) perquè tinga una estructura client-servidor i es connecte a un servidor per rebre les línies de la cançó. El protocol de comunicació entre el client i el servidor s'ha d'implementar mitjançant l'enviament d'objectes.

Client

ud3.practices.lyrics.client

Originalment, la classe Loader llig les línies, una a una, des d'un fitxer de text. Adapta el codi perquè, en lloc de llegir-les del fitxer, es connecte a un servidor disponible en localhost en el port 1234 per demanar-li les línies.

Implementa els missatges com a objectes.

El client ha de començar per preguntar al servidor quantes línies té la cançó, amb un missatge del tipus NUM_LINES. A continuació, ha d'enviar una petició del tipus GET indicant l'índex de la línia que vol rebre.

Servidor: LyricsServer

ud3.practices.lyrics.server

Crea el servidor LyricsServer en Java que escolte en el port 1234. El servidor proporciona la lletra de la cançó disponible en files/ud2/lyrics.txt.

El servidor ha de ser capaç de gestionar diferents clients a la vegada. Per tant, ha d'implementar la classe LyricsServerHandler per comunicar-se amb cada client.

Implementa els missatges com a objectes.

El servidor gestiona les peticions dels clients seguint el protocol següent:

  • NUM_LINES: el servidor respon amb un missatge del tipus SUCCESS amb el nombre de línies de la cançó.
  • GET + i:
    • Si i està dins del rang de línies de la cançó, el servidor respon amb un missatge del tipus SUCCESS amb la línia corresponent.
    • Si i està fora del rang, el servidor respon amb un missatge del tipus ERROR amb el missatge La línia solicitada no existeix.

Exemple d'execució

Exemple: Execució amb una cançó de dues línies

En aquest exemple, la cançó és la següent:

Ramonet, si vas a l'hort
porta figues, porta figues
  1. La classe Loader (client) es connecta amb el servidor.
  2. El client pregunta al servidor quantes línies té la cançó amb un missatge NUM_LINES.
  3. El servidor contesta amb SUCCESS 2.
  4. El client sol·licita la primera línia amb un missatge GET 0.
  5. El servidor rep GET 0 i contesta amb Ramonet, si vas a l'hort.
  6. El client rep la línia de la lletra i l'afig a la cua.
  7. El client envia el missatge GET 1.
  8. El servidor rep GET 1 i contesta amb porta figues, porta figues.
  9. El client rep la línia de la lletra i l'afig a la cua.
  10. Com que ja no queden línies, el client acaba la connexió.
sequenceDiagram
    actor Usuari
    Client->>Servidor: Connexió
    Servidor-->>Client: Connexió acceptada
    Client->>Servidor: NUM_LINES
    Servidor-->>Client: SUCCESS n
    loop i = 0 to n
        Client->>Servidor: GET i
        alt Línia 'i' existeix
            Servidor-->>Client: Línia i
            Client->>Usuari: Reprodueix línia
        else
            Servidor-->>Client: ERROR: La línia solicitada no existeix
            Client->>Client: Acaba el bucle i set 'end = true'
        end
    end
    Client->>Client: Acaba el bucle i set 'end = true'
📌 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.