Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    14

    [JAVA] Problema registrazione nuovi utenti CHAT

    Ciao a tutti ragazzi, vi scrivo nella speranza di trovare una soluzione a un problema che sto tentando di risolvere da vari giorni.

    Allora l'applicazione si tratta di una CHAT client-server in cui una volta avviato il server questo si mette in ascolto su una determinata porta per accettare le connessioni dei vari client:

    codice:
    public class  server {
        ServerSocket serverSocket = null;
        boolean listening = true;
        static ArrayList<PrintWriter> clientList = new ArrayList();
        static ArrayList<String> nicksList = new ArrayList();
        static int posizVettoreUtenti=0;
        protected static database db=new database();
    
    
        public server() {
    
            
            try {
                serverSocket = new ServerSocket(4000);
                System.out.println("Il server e' in ascolto");
    
    
            } catch (IOException e) {
                System.err.println("Could not listen on port: 4000.");
                System.exit(1);
            }
    
    
            while (listening)  {
                try {
                    Socket socket = serverSocket.accept(); //qui accetto le connessioni da parte dei client
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    clientList.add(out);
                    new serverMulti(out,in,socket,posizVettoreUtenti);
    				
                	}
                 catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
                try {
                    serverSocket.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
    
        }
    
    }
    La classe serverMulti e' una classe che estende THREAD:

    codice:
    public class serverMulti extends Thread {
         PrintWriter ot;
         BufferedReader in;
         boolean fine = false;
         Socket s;
         decodMessaggio mexRicevuto;
         String inputLine;
    
        public serverMulti(PrintWriter out, BufferedReader in,Socket s,int posizVettoreUtenti) {
            this.ot = out;
            this.in = in;
            this.s = s;
    	mexRicevuto=new decodMessaggio(s,ot,in,posizVettoreUtenti);
            System.out.println("Nuova connessione");
            guardaChiEntra();
            this.start();
            ot.println("Benvenuto sul server!");
        }
    
        @Override public void run() {
            try {
                while (!fine) {
                    try {
                        inputLine = in.readLine();
    			//in.readLine();
    			//ot.println(inputLine);
                            //ot.flush();
                        mexRicevuto.processaInput(inputLine);
                        if(inputLine.startsWith("#quit"))
                            fine=true;
                    } catch (Exception e) {
                    	fine = true;
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void guardaChiEntra()
        {
    
          try
          {
           inputLine = in.readLine();
          }catch(Exception e){};
    
          mexRicevuto.processaInput(inputLine);
        }
    }
    Non fate caso alla funzione guardaChiEntra(),ora non serve. La classe decodMessaggio e' una classe in cui chiamando il metodo processaInput(Oggetto) attraverso una protocollo scritto da me ricavo il tipo di messaggio che arriva al server(testo,servizio,etc....)per poi smistarlo ai vari client(attraverso il vettore di stream clientList).

    Ora il problema nasce quando avviando l'interfaccia di login per il client(posto solo gli eventi associati ai bottoni) decido di registrarmi inserendo un nuovo utente all'interno di un database(jButton2MouseClicked):

    codice:
    private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       
            // TODO add your handling code here:
    
            if(evt.getKeyCode() == KeyEvent.VK_ENTER)
            {
             if(!registrato)
             {
              utente=new client();
              System.out.println("SONO DENTRO");
             }
             
    
               nameUtente=jTextField1.getText();
    
                
               this.setVisible(false);
               AreaMex areaUtenti=new AreaMex(utente,nameUtente);
                
                
            }
        }                                      
    
        private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
            // TODO add your handling code here:
    
            if(!registrato)
              utente=new client();
             
            
    
            nameUtente=jTextField1.getText();
           
                this.setVisible(false);
                AreaMex areaUtenti=new AreaMex(utente,nameUtente);
           
        }                                     
    
        private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
            // TODO add your handling code here:
            this.setVisible(false);
    
            if(!registrato)
            {
              utente=new client();
              registrato=true;
              System.out.println("MI REGISTRO");
            }
    
            registrazione AreaReg=new registrazione(utente,this);
            
        }
    Viene avviato un nuovo client(posto solo la parte relativa alla connessione con il server):

    codice:
    public client ()
           {
    		try
    		{
                        
    		  socketClient=new Socket("nmartini.dyndns-server.com",4000);
    		  mexIngresso = new BufferedReader (new InputStreamReader(socketClient.getInputStream()));
                      mexUscita = new PrintWriter(socketClient.getOutputStream(), true);
                      
    		  //this.start();
    	   }
    	   catch(Exception e){};
            }
    Lanciando come detto in precedenza la registrazione mi si apre un nuovo Frame (classe registrazione) e da qui inserisco i vari dati.

    Posto la classe registrazione(solo gli eventi):
    codice:
    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
            // TODO add your handling code here:
            
            
            if(utente.registraNomeUtente(jTextField1.getText(), jPasswordField1.getText(), jTextField3.getText(),jTextField4.getText(),jTextField5.getText()))
            {
               this.setVisible(false);
               log.setVisible(true);
            }
    
        }                                     
    
        private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
            // TODO add your handling code here:
    
            utente.chiudiStream();
            this.setVisible(false);
        }
    Cliccando il tasto jButton1MouseClicked attraverso il client prima creato invio al server i dati(metodo registraNomeUtente()),i quali saranno poi inviati al database dal server stesso.

    Ora se nel frattempo provo a lanciare un nuovo client,questo non riuscira' a collegarsi al server finche' non ho terminato con l'altro client la registrazione(sembra che la registrazione blocchi l'accettazione delle richieste di connessione nel server).

    Spero di essermi spiegato abbastanza bene(lo so' il codice e' molto,ho tentato di tagliare alcune parti proprio per non renderlo ancora piu' lungo).

    Grazie per le eventuali risposte

  2. #2

    Re: [JAVA] Problema registrazione nuovi utenti CHAT

    Originariamente inviato da nico92
    La classe serverMulti e' una classe che estende THREAD:

    codice:
    public class serverMulti extends Thread {
         PrintWriter ot;
         BufferedReader in;
         boolean fine = false;
         Socket s;
         decodMessaggio mexRicevuto;
         String inputLine;
    
        public serverMulti(PrintWriter out, BufferedReader in,Socket s,int posizVettoreUtenti) {
            this.ot = out;
            this.in = in;
            this.s = s;
    	mexRicevuto=new decodMessaggio(s,ot,in,posizVettoreUtenti);
            System.out.println("Nuova connessione");
            guardaChiEntra();
            this.start();
            ot.println("Benvenuto sul server!");
        }
    Intanto questa non è proprio una grande idea, anche perchè fai troppe operazioni nel costruttore.

    Poi, prima di parlare della registrazione, per questa applicazione hai definito un protocollo proprietario? Il Server come fa a capire cosa deve fare l'utente?

    Questa cosa con java non c'entra nulla, però è fondamentale ai fini dell'applicazione.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    14
    Si utilizzo il metodo processaInput() della classe decodMessaggio:

    codice:
    public void  processaInput(String input) {
       
    			if(input.startsWith("#quit")) { //il client decide di uscira,viene cancellato dai vettori e dalla //lista utenti nella chat
    			System.out.println("Un client si e' sconnesso:");
    			sizeVettore=server.clientList.size();
    			sizeUtenti=server.nicksList.size();
    			for(i=0;i<sizeVettore && !trovato;i++)
    			{
    			  for(j=0;j<sizeUtenti && !trovato;j++)
    			  {
    			   stampaAltri=server.clientList.get(i);
    			   if(stampaAltri == ot)
    			   {
    				   utenteCanc=server.nicksList.get(i);
    				   server.clientList.remove(ot);
    				   server.nicksList.remove(i);
    				   trovato=true;
    				   j--;
    				   i--;
    				   server.posizVettoreUtenti--;
    			   }
    		         }
    		        }
                            trovato=false;
                            i=0;
                            j=0;
    			System.out.println(utenteCanc);
    
    			sizeUtenti=server.nicksList.size();
    			sizeVettore=server.clientList.size();
    			for(i=0;i<sizeVettore;i++)
    			{
    			  stampaAltri=server.clientList.get(i);
    			  stampaAltri.println("quit");
    			  stampaAltri.flush();
    			  for(j=0;j<sizeUtenti;j++)
    			  {
    				stampaAltri.println("~"+server.nicksList.get(j));
    			    stampaAltri.flush();
    		          }
    		        }
                            i=0;
                            j=0;
                            for(;i<sizeVettore;i++)
                            {
                                stampaAltri=server.clientList.get(i);
                                stampaAltri.println("exit"+utenteCanc);
                                stampaAltri.flush();
                            }
                            i=0;
                            j=0;
    			try
    			{
    				s.close();
    			}
    			catch(Exception e){System.out.println("Errore chiusura socket");};
    
        	        }
                    else if(input.startsWith("new")) //un nuovo client entra in chat
                    {
                        i=0;
                        j=0;
                        sizeVettore=server.clientList.size();
                        for(;i<sizeVettore-1;i++)
                        {
                            stampaAltri=server.clientList.get(i);
                            stampaAltri.println("new"+input.substring(3));
                            stampaAltri.flush();
                        }
                        i=0;
                        j=0;
                    }
    		else if(input.startsWith("~")) //il nome del nuovo client viene aggiunto nel vettore dei nick
    		{
                            
    			server.nicksList.add(input.substring(1));
    			server.posizVettoreUtenti++;
                            
    			sizeVettore=server.clientList.size();
    			sizeUtenti=server.nicksList.size();
            	        for(i=0;i<sizeVettore;i++)
    			{
    			  stampaAltri=server.clientList.get(i);
    			  if(stampaAltri == ot)
    			  {
    			   for(j=0;j<sizeUtenti;j++)
    			   {
    			    stampaAltri.println("~"+server.nicksList.get(j));
    			    stampaAltri.flush();
    		           }
    		          }
    			  else
    			  {
    				for(j=server.posizVettoreUtenti-1;j<sizeUtenti;j++)
    				{
    				  stampaAltri.println("~"+server.nicksList.get(j));
    			          stampaAltri.flush();
                                    }
    			  }
    		       }
                           i=0;
                           j=0;
    		    
                    }
                    else if(input.startsWith("!")) //un client invia un messaggio,lo uso per dire chi scrive il messaggio
                    {
                            sizeVettore=server.clientList.size();
            	        for(;i<sizeVettore;i++) {
    			   stampaAltri=server.clientList.get(i);
            		   stampaAltri.println(input.substring(1)+" scrive:\n");
    		       	   stampaAltri.flush();
            	        }
    			i=0;
    
                    }
                    else if(input.startsWith("access")) //lo uso per registrare un nuovo utente all'interno del database
                    {
                        int pass=input.indexOf("pass");
                        int nome=input.indexOf("nome");
                        int cognome=input.indexOf("surn");
                        int email=input.indexOf("emai");
    
    
    
                        //System.out.println(input.substring(6,pass));
                        if(server.db.aggiungiRiga(server.db.conn, "utenti", input.substring(6,pass), input.substring(pass+4,nome),input.substring(nome+4,cognome),input.substring(cognome+4,email),input.substring(email+4)))
                        {
                           ot.println("OK");
                           System.out.println("Nuovo utente aggiunto al db:"+input.substring(6,pass));
                        }
                        else
                            ot.println("NO");
                         
                         
                    }
                    else { //distribuisco a tutti i client il messaggio spedito dai client
    			sizeVettore=server.clientList.size();
                           
            	        for(;i<sizeVettore;i++) {
    			   stampaAltri=server.clientList.get(i);
            		   stampaAltri.println(input);
    		       	   stampaAltri.flush();
            	        }
                            i=0;
                    }
        }
    La classe client in base a cosa vorra' fare l'utente inviera' un messaggio composto da una parolina(quit,access,new,....) che servira' a far capire al server cosa vuola fare l'utente(input.startsWith()).

  4. #4
    Originariamente inviato da nico92
    La classe client in base a cosa vorra' fare l'utente inviera' un messaggio composto da una parolina(quit,access,new,....) che servira' a far capire al server cosa vuola fare l'utente(input.startsWith()).
    Ok..può andare.
    Il blocco è dovuto al fatto che il thread viene avviato dopo la prima chiamata di processInput, e questo causa chiaramente il problema che riscontri.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    14
    Grazie per la risposta...C'e' pero' una cosa che mi sfugge..la chiamata di processaInput() e' solo all'interno della funzione run()..come fa' a essere chiamata prima che il thread venga avviato??Il thread viene avviato quando creo la classe serverMulti(cioe' quando un nuovo client fa una richiesta di connessione).

    Se puo' essere d'aiuto ho provato nella classe registrazione a togliere la chiamata a registraNomeUtente():se la tolgo quando clicco sul bottone per registrare i dati,l'altro client non si sblocca,se invece lascio la chiamata l'altro client si sblocca.

  6. #6
    Originariamente inviato da nico92
    C'e' pero' una cosa che mi sfugge..la chiamata di processaInput() e' solo all'interno della funzione run()
    No..rileggi un po':
    Originariamente inviato da nico92
    codice:
    public class serverMulti extends Thread {
         PrintWriter ot;
         BufferedReader in;
         boolean fine = false;
         Socket s;
         decodMessaggio mexRicevuto;
         String inputLine;
    
        public serverMulti(PrintWriter out, BufferedReader in,Socket s,int posizVettoreUtenti) {
            this.ot = out;
            this.in = in;
            this.s = s;
    	mexRicevuto=new decodMessaggio(s,ot,in,posizVettoreUtenti);
            System.out.println("Nuova connessione");
            guardaChiEntra();
            this.start();
            ot.println("Benvenuto sul server!");
        }
    
        @Override public void run() {
            try {
                while (!fine) {
                    try {
                        inputLine = in.readLine();
    			//in.readLine();
    			//ot.println(inputLine);
                            //ot.flush();
                        mexRicevuto.processaInput(inputLine);
                        if(inputLine.startsWith("#quit"))
                            fine=true;
                    } catch (Exception e) {
                    	fine = true;
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void guardaChiEntra()
        {
    
          try
          {
           inputLine = in.readLine();
          }catch(Exception e){};
    
          mexRicevuto.processaInput(inputLine);
        }
    }
    Visto che il codice è tuo dovresti essere in grado di individuare errori al suo interno..

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    14
    Ok ok grazie mille era proprio quello

    Ora pero' deve capire perche' mi si blocca sulla pagina di registrazione quando invio i dati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.