<div class="page"> <div class="cover text-center"> <img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo"> # Cinema: Enviament d'objectes mitjançant sockets <div class="text-end fit-content ms-auto my-3 mt-auto pt-3"> <p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p> <p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p> <p><strong>Curs:</strong> 2024/2025</p> </div> <div> <p class="fw-bold mb-0">Llicència: BY-NC-SA</p> <p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p> <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank"> <img class="mx-auto" src="/itb/images/license.png" alt="Licence"/> </a> </div><!--license--> </div><!--cover--> </div><!--page--> {:toc} ## Objectius En aquest exemple es mostrarà com es pot crear un servidor i un client capaços de comunicar-se mitjançant l'enviament d'objectes. ## Codi font - __Models__: - <a href="/itb/DAM-PSP/files/ud3/examples/cinema/models/Film.java" download="Film.java">Film.java</a> - <a href="/itb/DAM-PSP/files/ud3/examples/cinema/models/Request.java" download="Request.java">Request.java</a> - <a href="/itb/DAM-PSP/files/ud3/examples/cinema/models/RequestType.java" download="RequestType.java">RequestType.java</a> - __Servidor__: - <a href="/itb/DAM-PSP/files/ud3/examples/cinema/server/CinemaServer.java" download="CinemaServer.java">CinemaServer.java</a> - <a href="/itb/DAM-PSP/files/ud3/examples/cinema/server/CinemaServerHandler.java" download="CinemaServerHandler.java">CinemaServerHandler.java</a> - __Client__: - <a href="/itb/DAM-PSP/files/ud3/examples/cinema/client/CinemaClient.java" download="CinemaClient.java">CinemaClient.java</a> ## Models: Request, RequestType i Film L'objectiu principal de l'aplicació es gestionar pel·lícules, per tant, hem creat la classe __Film__ que representa una pel·lícula. L'aplicació ha de permetre realitzar l'enviament de pel·lícules en els dos sentits. Per poder indicar-li al servidor quina acció es vol realitzar, hem creat la enumeració `RequestType`. Aquesta enumeració permet classificar cada petició en els següents tipus: - __GET__: El client enviarà una petició d'aquest tipus al servidor per sol·licitar-li una pel·licula al servidor. - __POST__: El client enviarà una petició d'aquest tipus al servidor per enviar-li una pel·lícula. - __SUCCESS__: El servidor respondrà amb aquest tipus si la acció solicitada s'ha portat a terme correctament. - __ERROR__: El servidor respondrà amb aquest tipus si hi ha hagut algun error processant la acció solicitada. Per últim, hem creat l'objecte `Request`, que representa una petició al servidor o una resposta al client. Aquest objecte esta identificat per un tipus `RequestType`, conté un objecte `Object` que pot ser adjuntat i un missatge `String`. L'objectiu d'aquesta classe es ser enviada mitjançant un `ObjectOutputStream` i ser rebuda per un `ObjectInputStream`, que poden ser creats amb el `OutputStream` i `InputSteam` de `Socket` respectivament. - __Client__: ```java ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputSteam()); Request req = new Request(RequestType.POST, new Film("La vida es bella", 1997, 116)) objOut.writeObject(request); ``` - __Servidor__: ```java ObjectInputStream objin = new ObjectInputStream(socket.getInputStream()); Request req = (Request) objIn.readObject(); if(req.getType() == RequestType.POST) Film film = (Film) req.getObject(); ``` Per poden enviar aquests objectes mitjançant sockets, s'han de poder convertir a un array de bytes. Per indicar-ho, __és necessari__ que les classes __implementen la interfície Serializable__. ## Client: CinemaClient Aquesta classe implementa un programa que es connecta al servidor i proporciona un menú per afegir i rebre pel·lícules del servidor. ## Servidor: CinemaServer i CinemaServerHandler La classe `CinemaServer` implementa un servidor que gestiona pel·lícules. Aquest servidor escolta en el port especificat i espera a que els clients es connecten. Cada vegada que un client es connecta, es crea un objecte `CinemaServerHandler`, que s'executa en un __fil independent__ i gestiona la comunicació amb el client. La classe `CinemaServerHandler` s'encarrega de gestionar les peticions del client. - Si la petició és del tipus __POST__, rebrà una pel·lícula i l'afegeix al servidor. - Si la petició és del tipus __GET__, buscarà la pel·licula solicitada i li la retornarà al client. ## Amplicació Modifica el programa proporcionat perquè el client li puga preguntar al servidor la llista de pel·lícules disponibles.