Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [Java] Richiamo metodo

  1. #1

    [Java] Richiamo metodo

    Salve a tutti.

    Ho creato una classe che implementa un ServerSocket.

    Questa classe ha due metodi:

    void Avvia(){

    //inizializzo il ss
    server = new ServerSocket(4444);

    while (pippo==true){
    //attende le connessioni dei client
    }


    }


    void Arresta(){

    //chiude il server socket
    server.close();

    }



    quando istanzio questa classe e lancio richiamo il metodo Avvia, questi rimane bloccato nel ciclo PIPPO==TRUE e non posso richiamare il metodo Arresta().

    c'è un modo per risolvere questo problema?

    Cioè nonostante abbia richiamato il metodo avvia vorrei che in qualsiasi momento possa richiamare anche quello Arresta()


    GRAZIE A TUTTI

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Quando istanzi un oggetto della tua classe, da qualche parte del codice, dovresti usare qualcosa come questa:
    codice:
    TuaClasse oggetto = new TuaClasse(); // crei il tuo oggetto
    ...
    oggetto.avvia(); // chiami il metodo avvia
    ...
    oggetto.arresta(); // Arresti il server
    Fossi in te, aggiungerei questa riga di codice dentro al metodo arresta():
    codice:
    pippo = false;
    E toglierei quel controllo while(pippo == true) modificandolo con while(pippo) che è esattamente equivalente.


    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

  3. #3
    Si facevo quello che dicevi tu....ma il problema rimane

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Ma da dove lo chiami il metodo arresta()? Deve chiamarlo da un altro thread o tramite un'azione avviata da un'interfaccia grafica, posta un po piu di codice,


  5. #5
    le classi sono un po' lunghine quindi è meglio che non le posto.


    Comunque diciamo che i metodi Avvia() e Arresta() sono in una classe chiamata ServerSCK


    Questa classe viene istanziata da un interfaccia grafica (Menu.class) tra le cui variabili dichiaro anche
    ServerSCK pippo = new ServerSCK();

    Chiaramente il problema è che quando dall'interfaccia grafica al click di un bottone faccio
    pippo.Avvia();

    mi si blocca tutto e non posso più cliccare un altro bottone che richiamerebbe il metodo
    pippo.Arresta();

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Sì... ora che vedo meglio è ovvio che si blocchi. Appena arriva un client entra in un loop stretto (attesa attiva). Non si gestisce così l'architettura client-server: quando arriva un client non devi entrare in un loop, ma avviare un Thread che lo gestisca. All'interno di questo thread puoi mettere un loop. Quindi devi gestire l'arrivo di un client nel modo seguente:
    codice:
    server = new ServerSocket(4444);
    
    Socket client = server.accept(); // Bloccante!!
    ( new MioThread(client.getInputStream(), client.getOutputStream()) ).start();
    Magari, inserisci prima il thread (la classe MioThread la devi implementare tu e deve estendere Thread) in un Vector così da poter gestire più client e da poter indirizzare ciascun thread.

    La classe MioThread prende 2 parametri: l'InputStream e l'OutputStream della Socket generata da ServerSocket per poter comunicare, quindi, col client.

    Se hai bisogno di ulteriori chiarimenti, posta pure!

    PS: Puoi inserire la parte di creazione del Socket e la creazione del Thread in un loop, tanto la chiamata a accept() è bloccante e non comporta un loop stretto.

    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

  7. #7
    grazie per le risposte.


    Non avendo postato codice non mi ero ben spiegato.

    In effetti io faccio come dice Lele, cioè ad ogni connessione del client io creo un nuovo thread che gestisce la chiamata.

    Il mio problema non era quello di chiudere la connessione col client, ma chiudere il ciclo del ServerSocket che genera i thread.

    Per il momento ho risolto in maniera che non so' se sia pulita o meno, cioè per chiudere il ciclo del server effettuo una connessione con un altro client che invia una stringa specifica, in quel caso il server viene spento e chiuso.

    Grazie a tutti comunque

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Guarda che non basta creare un nuovo thread per ogni connessione con il client, anche il ciclo while in cui il serversocket resta in attesa di connessioni deve essere eseguito in un opportuno thread separato, ovvero la tua classe ServerSCK deve estendere Thread e deve implementare un metodo run() che contiene il while. Quindi il tuo metodo avvia() deve semplcemente eseguire qlcosa tipo:

    pippo.start()

    cosi non può bloccarsi!


  9. #9
    esatto ma così facendo mi rimane un problema:

    cioè quando si crea un thread e lo si avvia la JVM chiama subito il metodo run().

    Diciamo che nel metodo run() di questo thread io avvio il serversocket, poi in seguito distruggo tale thread ma quando si procede alla distruzione non esiste un metodo richiamato da java dove io posso implementare il codice di chiusura del serversocket, magari mi rimane la porta sulla quale questi era in ascolto bloccata

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Se il thread viene distrutto penso che vengano rilascite le sue risorse.

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