<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.