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:
La classe serverMulti e' una classe che estende THREAD: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(); } } }
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).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); } }
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):
Viene avviato un nuovo client(posto solo la parte relativa alla connessione con il server):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); }
Lanciando come detto in precedenza la registrazione mi si apre un nuovo Frame (classe registrazione) e da qui inserisco i vari dati.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){}; }
Posto la classe registrazione(solo gli eventi):
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.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); }
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![]()

Rispondi quotando
