Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 22
  1. #11
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    ma se ho un'applicazione multithread dove dovrei chiudere la serversocket nella classe che mi gestisce la singola operazione o nel thred che è sempre in ascolto di altre richieste?

  2. #12
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da melmar20
    ma se ho un'applicazione multithread dove dovrei chiudere la serversocket nella classe che mi gestisce la singola operazione o nel thred che è sempre in ascolto di altre richieste?
    Il thread dove si fa la accept.
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #13
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    ok grazie mille!!!Provo e ti dico!!


  4. #14
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    Dunque ho avuto questa idea:

    in pratica effettuare una chiamata al server dal server stesso.Riporto un pò di codice forse si capisce meglio

    codice:
    public class Server extends Thread {
    	public static final int PORT=2222;
    	private ServerSocket s;
    	private Socket socket;
    	private boolean ascolto=true;
    	public Server(){
    		try {
    			s = new ServerSocket(PORT);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		start();	
    	}
    	public void run(){
    		try {
    			do{
    		        	socket = s.accept();
    		            try
    		            {
    		                new SingoloThread(socket);
    		            }
    		            catch(IOException e)
    		            {
    		            	socket.close();
    		                s.close();
    		            }
    		            if(!ascolto){
    		            	s.close();
    				}
    			}while(ascolto);
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    	}
    
    	public void Disconnetti(){
    		ascolto=false;
    		try {
    			Socket socket=null;
    			socket = new Socket(InetAddress.getByName(null), 2222);
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    mentre la classe che gestisce il singolo thread distrugge il socket.
    non sò se è una cosa lecita,adesso aggiusto un pò e vi dico se funziona.

    voi che ne pensate?

  5. #15
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Se vogliamo fare i pignoli non va molto bene: nel costruttore catturi IOException ma in ogni caso avvii il thread (che succede se usi un ServerSocket che ha lanciato IOException nella creazione??? ... meglio non provarci)
    Sarebbe meglio dichiarare che il costruttore può lanciare IOException e lasciare al chiamante la gestione dell'errore.

    Poi il costruttore di SingoloThread in teoria non dovrebbe nemmeno lanciare IOException, in genere il compito di un tale costruttore è solo quello di assegnare il socket passato come argomento in una variabile di istanza e avviare il thread (se vuoi farlo nel costruttore).

    Infine, provare a connettersi al server quando si vuole fare la disconnessione, solo per far uscire dalla accept() mi sembra un po' una fesseria. Come è già stato detto da LeleFT, basta mettere un timeout sul ServerSocket e c'è un metodo apposito bello lì pronto: setSoTimeout() (leggi bene la documentazione, prima di usarlo).
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #16
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    ok ma se io voglio Connettermi e Disconnettermi manualmente non posso utilizzare il metodo setSoTimeout() inquanto se mi vengo fatte richieste in quel momento non saprei come gestirle....

    Anche se poco ortodossa la soluzione del server che fà una richiesta a se stesso credo sia efficace. Adesso però devo assicurarmi che venga disconnesso manualmente ogni volta che si decida di chiudere l'applicazione.

    A tale proposito volevo creare una di quelle finestre tipiche di window che compaia ogni volta che si tenta di chiudere il frame con i due bottoni della connessione e mi obblighi a disconnettere il server e quindi a distruggere ogni socket e serversocket in modo che una volta riconnesso si possa creare una serversocket che sia in ascolto sulla porta della serversocket creata precedentemente.

    In soldoni è come se volessi gestire l'evento chiusura.

    Esiste un listener che mi permetta di farlo?

  7. #17
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ma poi dico: se anche fai una close() sul ServerSocket da un altro thread mentre il thread del server è nella accept() ... chissenefrega. Nel catch che gestisce le eccezioni della accept, ti basta testare la tua variabile che indica la terminazione.
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #18
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    Forse dovrei aprire un nuovo thread per questa discussione lo scrivo qui perchè cmq credo risolvendo questo quesito credo che ci siamo ed ho risolto i miei problemi con i socket.

    In pratica ho associato un listener all chiusura del frame scrivendo:

    codice:
    private void rootWindowClosed(WindowEvent evt) {
    		Integer controlloScelta=JOptionPane.showConfirmDialog(this, "Attenzione!!Chiudendo questa finestra ci si DISISCONNETTERA dal Server!Continuare?","Chiusura",JOptionPane.YES_NO_CANCEL_OPTION); 
    		switch(controlloScelta){
    		case 0:nuovo.Disconnetti();System.exit(0);
    		}
    	}
    se però clicco su no o su Annulla mi viene comunque chiuso il frame che ha lanciato il JOptionPane,perchè? non dovrebbe gestirmelo di default?

  9. #19
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Chiaramente il frame lo devi impostare con:

    setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);

    e quando ti viene data conferma fai un dispose()
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #20
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    ho provato con un DO_NOTHING_ON_CLOSE ma non mi fà niente non mi fà neanche comparire la finestra JOptionPane.showConfirmDialog!!

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.