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?
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.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?
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
ok grazie mille!!!Provo e ti dico!!
![]()
Dunque ho avuto questa idea:
in pratica effettuare una chiamata al server dal server stesso.Riporto un pò di codice forse si capisce meglio
mentre la classe che gestisce il singolo thread distrugge il socket.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(); } } }
non sò se è una cosa lecita,adesso aggiusto un pò e vi dico se funziona.
voi che ne pensate?
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 developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
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?
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 developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
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:
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?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); } }
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 developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
ho provato con un DO_NOTHING_ON_CLOSE ma non mi fà niente non mi fà neanche comparire la finestra JOptionPane.showConfirmDialog!!