L'usuari indicarà la ruta del fitxer on vol guardar la informació i comprovarà si el fitxer existeix.
Si existeix, preguntarà a l'usuari per la confirmació per ser sobreescrit. Si no ho confirma, torna al menu principal.
Li demanarà a l'usuari una contrasenya i crearà una SecretKey a partir d'ella.
El programa demanarà a l'usuari que escriga per pantalla tota la informació
que vol guardar en el fitxer. Deixarà de demanar-li la informació
quan l'usuari escriga una línia amb el contingut \exit.
Finalment, encriptarà tot el contingut
i el guardarà en el fitxer especificat.
L'usuari indicarà la ruta del fitxer que vol llegir i comprovarà si el fitxer existeix.
Si no existeix, mostrarà un missatge d'error i tornarà al menú principal.
Li demanarà a l'usuari una contrasenya i crearà una SecretKey a partir
d'ella. Finalment, intentarà desencriptar el fitxer.
Si la desencriptació ha segut satisfactòria, mostrara el contingut del fitxer desencriptat per pantalla.
En altre cas (per exemple, perquè la contrasenya no és l'adequada o el fitxer no estava encriptat), mostrarà un missatge d'error.
Adapta el codi de l'aplicació de l'Exercici: Chat
perquè utilitze SSLSockets.
Codi de l'exercici Chat solucionat
Client:
ChatClient.java
packageud3.exercises.chat.client;importjava.io.IOException;importjava.io.PrintWriter;importjava.net.Socket;importjava.util.Scanner;publicclassChatClient{privatefinalSocketsocket;privatefinalChatClientListenerlistener;privatefinalScannerscanner;privatefinalPrintWriterout;publicChatClient(Stringhost,intport)throwsIOException{this.scanner=newScanner(System.in);this.socket=newSocket(host,port);this.out=newPrintWriter(socket.getOutputStream(),true);this.listener=newChatClientListener(socket.getInputStream());}publicvoididentify(){System.out.print("Introdueix el teu nom: ");Stringline=scanner.nextLine();out.println(line);listener.start();}publicvoidchat()throwsIOException{System.out.println("Acabes d'entrar al chat.");System.out.println("Per exir, escriu \"/exit\".");Stringline;while(!(line=scanner.nextLine()).equals("/exit")&&this.socket.isConnected()){out.println(line);}close();}publicvoidclose(){try{socket.close();listener.interrupt();}catch(IOExceptione){thrownewRuntimeException(e);}}publicstaticvoidmain(String[]args){System.out.println("Connectant-se amb el servidor...");try{ChatClientchat=newChatClient("localhost",1234);chat.identify();chat.chat();}catch(IOExceptione){System.err.println("Error connectant-se amb el servidor.");}}}
packageud3.exercises.chat.server;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassChatServerextendsThread{ServerSocketserver;List<ChatServerHandler>clients;booleanrunning;publicChatServer(intport)throwsIOException{server=newServerSocket(port);clients=newArrayList<>();running=true;}publicvoidclose(){running=false;this.interrupt();}publicsynchronizedvoidremoveClient(ChatServerHandlerclient){clients.remove(client);}publicvoidsendMessage(Stringmsg){for(ChatServerHandlerclient:clients){client.sendMessage(msg);}}publicvoidsendMessage(Stringalias,Stringmsg){clients.stream().filter(client->!client.getNom().equals(alias)).forEach(client->client.sendMessage(msg));}@Overridepublicvoidrun(){while(running){try{Socketclient=server.accept();ChatServerHandlerhandler=newChatServerHandler(client,this);clients.add(handler);handler.start();System.out.println("Nova connexió acceptada.");}catch(IOExceptione){System.err.println("Error while accepting new connection");System.err.println(e.getMessage());}}}publicstaticvoidmain(String[]args){try{Scannerscanner=newScanner(System.in);ChatServerserver=newChatServer(1234);server.start();scanner.nextLine();server.close();}catch(IOExceptione){thrownewRuntimeException(e);}}}
ChatServerHandler.java
packageud3.exercises.chat.server;importjava.io.*;importjava.net.Socket;publicclassChatServerHandlerextendsThread{privatefinalSocketsocket;privatefinalChatServerserver;privatefinalPrintWriterout;privatefinalBufferedReaderin;privateStringnom;publicChatServerHandler(Socketsocket,ChatServerserver)throwsIOException{this.socket=socket;this.server=server;this.in=newBufferedReader(newInputStreamReader(socket.getInputStream()));this.out=newPrintWriter(socket.getOutputStream(),true);}publicStringgetNom(){returnnom;}publicvoidsetNom(Stringnom){this.nom=nom;}publicvoidsendMessage(Stringmessage){out.println(message);}@Overridepublicvoidrun(){try{Stringnom=in.readLine();setNom(nom);System.out.printf("%s s'ha identificat.\n",getNom());// Quan un client es desconecta, l'operació readLine() retorna nullStringmessage;while((message=in.readLine())!=null){StringmessageWithName=String.format("%s: %s",getNom(),message);System.out.println(messageWithName);server.sendMessage(messageWithName);}System.out.printf("%s has disconnected.\n",getNom());socket.close();}catch(IOExceptione){System.err.println(e.getMessage());}finally{server.removeClient(this);}}}
Cal generar:
KeyStore de ChatServer: Guardar-la al fitxer files/ud4/chat/chat-server.jks.
Indica la comanda utilitzada com a comentari en el moment que es cree el SSLServerSocket en la classe
ChatServer.
Important
La informació del certificat de mostrar
per terminal quan inicie el servidor.
Certificat:
Camp
Valor
Àlies
chat-server
CN
ChatServer
OU
PSP-DAM2S
O
CIPFP Mislata
L
Mislata
ST
València
C
ES
TrustStore de ChatClient: Guardar-la al fitxer files/ud4/chat/chat-client.jks.
Indica la comanda utilitzada com a comentari en el moment que es cree el SSLServerSocket en la classe
ChatClient.
Cal importar el certificat del servidor generat anteriorment.
📌 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.