diff --git a/src/it/valsecchi/polypserver/PolypServer.java b/src/it/valsecchi/polypserver/PolypServer.java index eea53f5..c35e509 100644 --- a/src/it/valsecchi/polypserver/PolypServer.java +++ b/src/it/valsecchi/polypserver/PolypServer.java @@ -15,7 +15,7 @@ * @author Davide * */ -public class PolypServer { +public class PolypServer implements Runnable { public UsersManager users_manager; public SessionsManager sessions_manager; @@ -26,17 +26,20 @@ public class PolypServer { private int max_clients; public String polyp_password; public String polyp_path; - private boolean run_polyp_server = true; + /** Variabile che controlla la continuazione dell'esecuzione del server */ + private boolean run_polyp_server; + private Thread polyp_thread; - public PolypServer(String polyp_name, int port, int max_clients,String password, String path) { + public PolypServer(String polyp_name, int port, int max_clients, + String password, String path) { users_manager = new UsersManager(this); sessions_manager = new SessionsManager(this); files_manager = new FilesManager(this); this.polyp_name = polyp_name; this.port = port; this.max_clients = max_clients; - this.polyp_password= password; - this.polyp_path= path; + this.polyp_password = password; + this.polyp_path = path; // inizializzo il server try { polyp_server = new ServerSocket(this.port, this.max_clients); @@ -47,15 +50,58 @@ public PolypServer(String polyp_name, int port, int max_clients,String password, /** * Metodo che avvia il server + * + * @throws Exception */ - public void runPolyp() { + public void startPolyp() throws Exception { + // inizializzo il server + try { + polyp_server = new ServerSocket(this.port, this.max_clients); + } catch (IOException e) { + Log.error("errore creazione polyp_server: " + this.polyp_name); + this.run_polyp_server = false; + throw new Exception("errore creazione polyp_server: " + + this.polyp_name); + } + this.run_polyp_server = true; + // si avvia su thread separato la ricezione client del server + this.polyp_thread = new Thread(this, + "Thread principale del PolypServer"); + this.polyp_thread.start(); + // si prosegue consentendo l'interazione con l'utente. + this.startServerShell(); + } + + /** + * Metodo che ferma il server + */ + public void stopPolyp() { + // si salvano tutti i dati + this.users_manager.writeUsers(); + this.files_manager.writeFiles(); + // si ferma il ciclo + this.run_polyp_server = false; + //TODO controllare chiusura server + } + + @Override + /** + * Metodo che avvia il processo base del server per ricevere richieste client su un thread separato. + */ + public void run() { // attesa connessioni while (this.run_polyp_server) { Log.info("server in attesa di connessioni..."); try { Socket socket = polyp_server.accept(); - Log.info("connessione stabilita con: " +socket.getInetAddress()); - //si crea e aggiunge la sessione + Log.info("connessione stabilita con: " + + socket.getInetAddress()); + //si esce se non si può continuare a utilizzare il server + if (this.run_polyp_server == false) { + socket.close(); + return; + } + // si crea e aggiunge la sessione sessions_manager.addSession(socket); } catch (IOException e) { Log.error("errore nella connessione al server..."); @@ -63,14 +109,8 @@ public void runPolyp() { } } - /** - * Metodo che ferma il server - */ - public void stopPolyp(){ - //si salvano tutti i dati - this.users_manager.writeUsers(); - //si ferma il ciclo - this.run_polyp_server= false; + private void startServerShell(){ + } } diff --git a/src/it/valsecchi/polypserver/connection/PMessage.java b/src/it/valsecchi/polypserver/connection/PMessage.java new file mode 100644 index 0000000..3194cd3 --- /dev/null +++ b/src/it/valsecchi/polypserver/connection/PMessage.java @@ -0,0 +1,30 @@ +package it.valsecchi.polypserver.connection; + +/** + * Enumeratore che rappresenta i messaggi che si scambiano PolypServer e Client; + * @author Davide Valsecchi + * + */ +public enum PMessage { + + /** Comunicazione andata a buon fine*/ + OK, + /** Errore generico*/ + ERROR, + /** Errore trasmissione lista file*/ + ERRORE_LISTA_FILE, + /** Password scorretta*/ + WRONG_PASSWORD, + /** Utente già connesso*/ + ALREADY_CONNECTED, + /** Utente correttamente connesso*/ + CONNECTED, + /** Utente sincronizzato*/ + SYNCHRONIZED; + + + + + + +} diff --git a/src/it/valsecchi/polypserver/connection/Session.java b/src/it/valsecchi/polypserver/connection/Session.java index 8323bff..40d6981 100644 --- a/src/it/valsecchi/polypserver/connection/Session.java +++ b/src/it/valsecchi/polypserver/connection/Session.java @@ -8,14 +8,11 @@ import it.valsecchi.polypserver.exception.UserAlreadyConnectedException; import it.valsecchi.polypserver.exception.WrongPasswordException; import static it.valsecchi.polypserver.Utility.Log; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.List; -import java.util.Map; import java.util.StringTokenizer; /** @@ -66,7 +63,7 @@ public void run() { } // ora si richiede la lista file e si invia quella del server try { - this.manageFileList(); + this.synchronizeData(); } catch (StreamException e) { Log.error("errore stream"); this.close(); @@ -82,12 +79,8 @@ public void run() { private void listenForRequests() { try { while (this.session_active) { - String cmd = this.readString(); - switch(cmd){ - - } - - + PMessage cmd = this.readMessage(); + } } catch (StreamException e) { @@ -128,7 +121,7 @@ public void getUserInfo() throws StreamException, WrongPasswordException, // password errata Log.error("User: " + userid + ", password errata!"); // si invia la risposta - this.sendConnectionAnswer("WRONG_PASSWORD"); + this.sendMessage(PMessage.WRONG_PASSWORD); throw e; } // si attiva l'utente @@ -136,11 +129,11 @@ public void getUserInfo() throws StreamException, WrongPasswordException, if (connected == false) { // si chiude perchè è già connesso Log.error("user già connesso: " + userid); - this.sendConnectionAnswer("ALREADY_CONNECTED"); + this.sendMessage(PMessage.ALREADY_CONNECTED); throw new UserAlreadyConnectedException(); } // si indica all'utente l'avvenuta connessione - this.sendConnectionAnswer("CONNECTED"); + this.sendMessage(PMessage.CONNECTED); this.user_id = userid; } @@ -169,39 +162,72 @@ public void close() { * @throws StreamException * @throws GenericException */ - private void manageFileList() throws StreamException, GenericException { + private void synchronizeData() throws StreamException, GenericException { List file_list = null; try { file_list = this.readFileList(); } catch (StreamException e) { // si risponde che c'è stato un'errore - this.sendAnswer("ERRORE_LISTA"); + this.sendMessage(PMessage.ERRORE_LISTA_FILE); throw e; } // si invia l'ok - this.sendAnswer("OK"); + this.sendMessage(PMessage.OK); // si invia al file manager per aggiornarla server.files_manager.setFileList(this.user_id, file_list); // ora si invia la lista file completa this.sendFileList(); // si attende la risposta - String ans; - ans = this.readString(); - if (ans.equals("OK")) { - // ok la connessione è effettuata - } else if (ans.equals("ERROR")) { + PMessage m = this.readMessage(); + if (m == PMessage.OK) { + // ok si prosegue + } else if (m == PMessage.ERROR) { // Si chiude la connessione this.close(); Log.error("errore comunicazione lista file"); throw new GenericException(); } + // si invia la lista utenti + this.sendAvaibleUserList(); + // si attende la risposta + PMessage m2 = this.readMessage(); + if (m2 == PMessage.OK) { + // ok la connessione è effettuata + this.sendMessage(PMessage.SYNCHRONIZED); + //la connessione è effettuata + } else if (m2 == PMessage.ERROR) { + // Si chiude la connessione + this.close(); + Log.error("errore comunicazione lista utenti attivi"); + throw new GenericException(); + } } - /** Metodo che legge le stringhe inviate dal client */ + /** Metodo che legge i messaggi inviati dal client */ + private PMessage readMessage() throws StreamException { + try { + return (PMessage) input.readObject(); + } catch (ClassNotFoundException e) { + Log.error("errore lettura messaggio"); + throw new StreamException("errore lettura messaggio"); + } catch (IOException e1) { + Log.error("errore lettura stringa"); + throw new StreamException("errore lettura messaggio"); + } + } + + /** + * Metodo che legge le stringhe inviate dal client + * + * @throws StreamException + */ private String readString() throws StreamException { try { return (String) input.readObject(); - } catch (ClassNotFoundException | IOException e) { + } catch (ClassNotFoundException e) { + Log.error("errore lettura stringa"); + throw new StreamException("errore lettura stringa"); + } catch (IOException e1) { Log.error("errore lettura stringa"); throw new StreamException("errore lettura stringa"); } @@ -210,7 +236,10 @@ private String readString() throws StreamException { private List readFileList() throws StreamException { try { return (List) input.readObject(); - } catch (ClassNotFoundException | IOException e) { + } catch (ClassNotFoundException e) { + Log.error("errore lettura lista file"); + throw new StreamException("errore lettura lista file"); + } catch (IOException e1) { Log.error("errore lettura lista file"); throw new StreamException("errore lettura lista file"); } @@ -225,23 +254,45 @@ public void sendFileList() throws StreamException { } } - public void sendConnectionAnswer(String ans) throws StreamException { + public void sendAvaibleUserList() throws StreamException { try { - output.writeObject(ans); - output.flush(); + output.writeObject(server.users_manager.getListAvaibleUser()); } catch (IOException e) { - Log.error("errore invio risposta connessione"); - throw new StreamException("errore invio risposta connessione"); + Log.error("errore invio lista utenti attivi"); + throw new StreamException("errore invio lista file"); } } - public void sendAnswer(String ans) throws StreamException { + public void sendMessage(PMessage ans) throws StreamException { try { output.writeObject(ans); output.flush(); } catch (IOException e) { - Log.error("errore invio risposta"); - throw new StreamException("errore invio risposta"); + Log.error("errore invio messaggio"); + throw new StreamException("errore invio messaggio"); + } + } + + protected byte[] readNBytes(int n) throws StreamException{ + byte[] buf = new byte[n]; + //si leggono + try { + input.read(buf, 0, n); + } catch (IOException e) { + Log.error("errore lettura trasmissione dati"); + throw new StreamException("errore lettura trasmissione dati"); + } + return buf; + } + + protected void writeNBytes(byte[] buf) throws StreamException{ + //si scrivono + try { + output.write(buf); + output.flush(); + } catch (IOException e) { + Log.error("errore scrittura trasmissione dati"); + throw new StreamException("errore scrittura trasmissione dati"); } } diff --git a/src/it/valsecchi/polypserver/connection/SessionsManager.java b/src/it/valsecchi/polypserver/connection/SessionsManager.java index eff07c7..8e6f908 100644 --- a/src/it/valsecchi/polypserver/connection/SessionsManager.java +++ b/src/it/valsecchi/polypserver/connection/SessionsManager.java @@ -4,7 +4,6 @@ import java.net.Socket; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; /** @@ -19,7 +18,7 @@ public class SessionsManager { public SessionsManager(PolypServer server) { this.server = server; - sessionsList = new ArrayList<>(); + sessionsList = new ArrayList(); } /** Metodo che aggiunge alla lista una sessione e la avvia */ diff --git a/src/it/valsecchi/polypserver/data/FilesManager.java b/src/it/valsecchi/polypserver/data/FilesManager.java index a934d7f..12af39f 100644 --- a/src/it/valsecchi/polypserver/data/FilesManager.java +++ b/src/it/valsecchi/polypserver/data/FilesManager.java @@ -2,10 +2,9 @@ import static it.valsecchi.polypserver.Utility.Log; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -41,14 +40,17 @@ public FilesManager(PolypServer server) { private void loadFiles() { // si legge il file Users Document doc = new Document(); - if (Files.exists(Paths.get(server.polyp_path - + "\\files\\files_data.xml"))) { + File file = new File(server.polyp_path + + "\\files\\files_data.xml"); + if (file.exists()) { // solo se esiste si legge se no si lascia così SAXBuilder build = new SAXBuilder(); try { doc = build .build(server.polyp_path + "\\files\\files_data.xml"); - } catch (JDOMException | IOException e) { + } catch (JDOMException e) { + Log.error("errore lettura dati file"); + }catch( IOException e1){ Log.error("errore lettura dati file"); } } @@ -61,7 +63,7 @@ private void loadFiles() { } /** Metodo che scrive i dati degli files nel file files_data */ - public void writeUsers() { + public void writeFiles() { // si crea un document e lo si scrive Document doc = new Document(); doc.setRootElement(new Element("files_data")); diff --git a/src/it/valsecchi/polypserver/data/UsersManager.java b/src/it/valsecchi/polypserver/data/UsersManager.java index c7199a0..4e98555 100644 --- a/src/it/valsecchi/polypserver/data/UsersManager.java +++ b/src/it/valsecchi/polypserver/data/UsersManager.java @@ -4,12 +4,12 @@ import it.valsecchi.polypserver.exception.WrongPasswordException; import static it.valsecchi.polypserver.Utility.Log; -import java.io.FileNotFoundException; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.jdom2.Document; import org.jdom2.Element; @@ -25,7 +25,7 @@ public class UsersManager { public UsersManager(PolypServer server) { this.server = server; - usersMap = new HashMap<>(); + usersMap = new HashMap(); this.loadUsers(); } @@ -33,14 +33,17 @@ public UsersManager(PolypServer server) { private void loadUsers() { // si legge il file Users Document doc = new Document(); - if (Files.exists(Paths.get(server.polyp_path - + "\\users\\users_data.xml"))) { + File file = new File(server.polyp_path + + "\\users\\users_data.xml"); + if (file.exists()) { // solo se esiste si legge se no si lascia così SAXBuilder build = new SAXBuilder(); try { doc = build .build(server.polyp_path + "\\users\\users_data.xml"); - } catch (JDOMException | IOException e) { + } catch (JDOMException e) { + Log.error("errore lettura dati utenti"); + }catch( IOException e1){ Log.error("errore lettura dati utenti"); } } @@ -118,5 +121,15 @@ public boolean isUserAvaiable(String userid) { return false; } } + + public List getListAvaibleUser(){ + List us = new ArrayList(); + for(User u: usersMap.values()){ + if(u.isOnline()== true){ + us.add(u.getID()); + } + } + return us; + } } diff --git a/src/it/valsecchi/polypserver/exception/StreamException.java b/src/it/valsecchi/polypserver/exception/StreamException.java index 5e95173..e1c344c 100644 --- a/src/it/valsecchi/polypserver/exception/StreamException.java +++ b/src/it/valsecchi/polypserver/exception/StreamException.java @@ -1,5 +1,7 @@ package it.valsecchi.polypserver.exception; +import it.valsecchi.polypserver.connection.PMessage; + public class StreamException extends Exception { private static final long serialVersionUID = 121931363756498398L; @@ -7,5 +9,4 @@ public class StreamException extends Exception { public StreamException(String mess) { super(mess); } - } diff --git a/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java b/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java index b607c7b..418be63 100644 --- a/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java +++ b/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java @@ -2,9 +2,6 @@ public class UserAlreadyConnectedException extends Exception { - /** - * - */ private static final long serialVersionUID = 2007059883462839443L; }