Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655

    Distruggere un ServerSocket

    Ciao, è possibile distruggere un ServerSocket.

    Anche se interrrompo il thread che lo genera il ServerSocket continua ad occuparmi una porta infatti se faccio ripartire il programma e tento di creare un nuovo ServerSocket sulla stessa porta mi viene segnalato questo errore:

    "Address already in use: JVM_Bind"

    che potrei fare per distruggere ogni tipo di comunicazione?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Distruggere un ServerSocket

    Originariamente inviato da melmar20
    Ciao, è possibile distruggere un ServerSocket.
    close()
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    mentre per una socket normale non è possibile utilizzare il metodo close()?

    in pratica ho scritto:
    codice:
    private ServerSocket s;
    private Socket socket;
    
    socket = s.accept();
    una volta che scrivo s.close(), ovvero chiudo la ServerSocket, mi viene segnalato questo errore :
    codice:
    java.net.SocketException: socket closed
    	at java.net.PlainSocketImpl.socketAccept(Native Method)
    	at java.net.PlainSocketImpl.accept(Unknown Source)
    	at java.net.ServerSocket.implAccept(Unknown Source)
    	at java.net.ServerSocket.accept(Unknown Source)
    	at cbbp.Server.run(Server.java:35)
    non ho ancora capito a cosa è dovuto,forse perchè non distruggo il thread che fà governa il codice,anche se ho utilizzato this.interrupt()!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da melmar20
    mentre per una socket normale non è possibile utilizzare il metodo close()?
    Ancora close()
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    Un thread invece non può essere distrutto?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da melmar20
    Un thread invece non può essere distrutto?
    Un thread è in stato "dead" (morto) quando il suo run() ha terminato la esecuzione.
    L'oggetto Thread esiste ancora, se ne hai un reference. In ogni caso non devi preoccuparti. Se il run() è terminato e ad un certo punto del tuo programma non ci sono più reference all'oggetto Thread, esso può essere tranquillamente garbage-collected.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    Forse però non ho centrato il problema nel mio programma ho scritto

    codice:
    socket = s.accept();
    s.close();
    e mi viene sollevata l'eccezione

    java.net.SocketException: socket closed
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(Unknown Source)
    at java.net.ServerSocket.implAccept(Unknown Source)
    at java.net.ServerSocket.accept(Unknown Source)
    at cbbp.Server.run(Server.java:35)

    quindi credo che se distruggo il serversocket si crea un riferimento ad un oggetto null che è socket,almeno questo è quello che in questo momento mi viene in mente,poi dimmi un pò tu se sono totalmente fuoristrada o in quello che ho detto c'è qualcosa di fondato...

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Dovresti mandare piu' codice, perche' cosi' non si capisce molto la struttura del tuo programma. In ogni caso, dalle API puoi vedere quello che immagino sia la causa della tua eccezione.
    public void close() throws IOException
    Closes this socket. Any thread currently blocked in accept() will throw a SocketException.
    If this socket has an associated channel then the channel is closed as well.
    La close dovrebbe stare nello stesso thread che esegue la accept, in modo da non sollevare eccezioni di questo tipo e fuori da eventuali cicli che eseguirebbero l'accept dopo che la serversocket viene chiusa.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    dunque ho scritto:

    codice:
    private ServerSocket s;
    private boolean ascolto=true;
    
    public void run(){
    		try {
    			while(ascolto)
    	        {
    	        	Socket socket = s.accept();
    	            try
    	            {
    	                new SingoloThread(socket);
    	            }
    	            catch(IOException e)
    	            {
    	                e.printStackTrace();
    	            }
    	        } 
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    	}
    
    	public void Disconnetti(){
    		try {
    			ascolto=false;
    			s.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    l'errore però è sempre lo stesso!!

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questo accade perchè tu chiudi la ServerSocket da un metodo diverso da quello che effettua la accept.
    Questo è lo scenario: hai una chiamata in corso al metodo accept() e tu, mentre (contemporaneamente) la chiamata è in corso, effettui una close(). Ovviamente la accept() va in errore.

    Il metodo close() lo dovresti richiamare quando sei sicuro che non c'è nessuna accept() pendente.

    Per assicurartene devi procedere in questo modo: impostare sulla ServerSocket un timeout. Significa che ogni tot millisecondi la accept termina (genera una eccezione che dovrai, ovviamente, controllare silenziosamente). In questo modo, controlli se è stata impostata a false la variabile che controlla il loop di ascolto. Se è stata impostata a false, effettui la close (tanto non rientrerà mai nella accept() ).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.