<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# Creació de 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 poden crear programes que utilitzen objectes `Socket` i `ServerSocket`
per comunicar-se entre ells.
El codi està disponible també a GitHub: https://github.com/fpmislata-dam2s-psp/PuigcerverJoan-PSP-solucions/tree/main/src/ud3/examples
## Classe CreateClient
### Codi font
```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ó.
## Classe CreateServer
### Codi font
```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.
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari