<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.
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari