packageud3.examples.multiclient.client;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.ConnectException;importjava.net.Socket;importjava.util.Scanner;publicclassMulticlientClient{publicstaticvoidmain(String[]args){try{Stringhost="localhost";intport=1234;System.out.println("Creant el Socket client.");Socketsocket=newSocket(host,port);BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));// Es pot utilitzar l'opció autoflushPrintWriterout=newPrintWriter(socket.getOutputStream(),true);Scannerscanner=newScanner(System.in);// Identifiquem el client en el servidor.// El servidor el primer que fa és esperar el nomSystem.out.print("Introdueix el teu nom: ");Stringnom=scanner.nextLine();out.println(nom);// El client pot enviar missatges fins que escriga ENDStringline;System.out.print("Text: ");while(!(line=scanner.nextLine()).equals("END")){out.println(line);System.out.print("Text: ");}// Tanquem la connexió al acabarsocket.close();}catch(ConnectExceptione){System.err.println("Connection refused!");}catch(IOExceptione){thrownewRuntimeException(e);}}}
Aquest programa crea un client que es connecta al servidor. Després, demana un nom per identificar-se
i permet escriure missatges al servidor fins que s'escriga la paraula END.
Per poder executar a la vegada varies instàncies de MulticlientClient en IntelliJ, cal que modifiqueu la
configuració d'execució.
Heu d'anar a: Run > Edit Configurations... > Seleccionar MulticlientClient > Build and run > Modify options > Marcar "Allow multiple instances"
packageud3.examples.multiclient.server;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayList;importjava.util.List;publicclassMulticlientServerextendsThread{privatefinalServerSocketserver;privatefinalList<MulticlientServerHandler>clients;privatebooleanrunning;/** * Crea un servidor ServerSocket a partir del port. * * @param port Port on escoltarà el servidor * @throws IOException Excepcions del constructor ServerSocket */publicMulticlientServer(intport)throwsIOException{server=newServerSocket(port);clients=newArrayList<>();running=true;}/** * Para l'execució del servidor i totes les gestions dels clients */publicvoidclose(){running=false;for(MulticlientServerHandlerclient:clients){try{client.close();}catch(IOExceptionignored){}client.interrupt();}this.interrupt();}/** * Fil d'execució del servidor. * <p> * El servidor escolta el port i espera noves connexions. * Quan una nou client es connecta, es crea un objecte ServerHandler, * que gestionarà la comunicació amb aquest client en un fil distint. * <p> * D'aquesta manera, el servidor pot continuar escoltant i esperant * noves connexions mentres cada fil gestiona la comunicació * amb cada client. */@Overridepublicvoidrun(){while(running){try{Socketclient=server.accept();System.out.println("Nou client acceptat.");MulticlientServerHandlerhandler=newMulticlientServerHandler(client);clients.add(handler);handler.start();}catch(IOExceptione){System.err.println("Error while accepting new connection");System.err.println(e.getMessage());}}}publicstaticvoidmain(String[]args){MulticlientServerserver=null;try{server=newMulticlientServer(1234);server.start();server.join();}catch(IOExceptionex){System.out.println(ex.getMessage());}catch(InterruptedExceptionex){System.out.println("Tancant el servidor de manera segura...");server.close();}}}
Aquesta classe implementa un servidor capaç de gestionar multiples clients. Aquesta classe també està
pensada per ser executada en un fil independent.
El servidor s'inicia i espera connexions. Quan una connexió es realitzada per part d'un client,
el servidor crea i inicia una instància de la classe ServerHandler, que s'encarrega de gestionar
les respostes amb el client.
packageud3.examples.multiclient.server;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.Socket;/** * Classe que gestiona la comunicació del servidor * amb un únic client en un fil d'execució independent. */publicclassMulticlientServerHandlerextendsThread{privatefinalSocketsocket;privatefinalBufferedReaderin;privatefinalPrintWriterout;privateStringnom;publicMulticlientServerHandler(Socketsocket)throwsIOException{this.socket=socket;in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newPrintWriter(socket.getOutputStream(),true);nom=null;}publicStringgetNom(){returnnom;}publicvoidsetNom(Stringnom){this.nom=nom;}publicvoidclose()throwsIOException{socket.close();}/** * Fil d'execució independent per cada client. * <p> * Abans que res, el client s'identifica amb un nom. * Després, el servidor mostra els missatges que cada client ha enviat. */@Overridepublicvoidrun(){try{setNom(in.readLine());System.out.printf("%s s'ha identificat.\n",getNom());// Quan un client es desconecta, l'operació readLine() retorna nullStringmessage;while((message=in.readLine())!=null){System.out.printf("%s: %s\n",getNom(),message);}System.out.printf("%s has disconnected.\n",getNom());close();}catch(IOExceptione){System.err.println("Error while handling client.");System.err.println(e.getMessage());}}}
Aquesta classe implementa les respostes del servidor a un únic client
en un fil independent.
Aquest fil li demana el nom per identificar el client i després mostrarà tots els missatges que
el client envie al servidor fins que aquest acabe la connexió.
📌 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.