Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] uscire da un ciclo infinito

    salve a tutti avrei il seguente problema:

    nella classe in fondo rimango in attesa all'infinito dell'arrivo di msg dalla rete ma vorrei in qualche maniera poter uscire digitando il comando exit, o anche in una maniera più pulita se potete suggerirla....
    Avrei questa necessità altrimenti bloccando in maniera brusca il programma al successivo lancio, giustamente, mi dà un errore di BindException.

    private void ciclo() throws SocketException, IOException
    {
    byte buffer[] = new byte [65536];

    // entra in un ciclo infinito in attesa di messaggi dalla rete
    while(true)
    {
    System.out.println("In attesa di messaggi....");
    dpacket=new DatagramPacket(buffer, buffer.length);
    rSocket.receive(dpacket); // riceve un nuovo msg

    // creazione e lancio di un nuovo Thread per gestire l'arrivo di un pacchetto
    NodeManagerReceiver e=new NodeManagerReceiver();
    Thread t1=new Thread(e);
    t1.start();
    }
    }
    Come posso fare?????

    grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    43
    così com'è strutturato devi solo interromperlo "bruscamente".
    dovrest fare un thread ascoltatore che quando premi un tasto a tua scelta mette la
    boolean da true a false, ma uscirà solo dopo che arriva un messaggio perchè la chiamata

    rSocket.receive(dpacket); è bloccante.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da yakino
    così com'è strutturato devi solo interromperlo "bruscamente".
    dovrest fare un thread ascoltatore che quando premi un tasto a tua scelta mette la
    boolean da true a false, ma uscirà solo dopo che arriva un messaggio perchè la chiamata

    rSocket.receive(dpacket); è bloccante.
    Questo è in parte vero.

    E' vero che il codice, così strutturato non va bene: non devi utilizzare la costante true per comandare la guardia del while, piuttosto devi utilizzare un flag booleano che andrai ad impostare a false nel momento in cui decidi di uscire.

    Non è vero che la chiamata è strettamente bloccante: sia Socket, che DatagramSocket (oltre alla ServerSocket) hanno un metodo chiamato setSoTimeout() che imposta, appunto, un timeout. La chiamata alla receive(), quindi, attenderà l'arrivo di un pacchetto fino allo scadere del timeout (in millisecondi). Se non arriva nulla entro il tempo prestabilito, la chiamata termina (e viene lanciata una SocketTimeOutException), che potrai catturare per, eventualmente, impostare a false il flag della guardia.


    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    43
    Originariamente inviato da LeleFT
    Non è vero che la chiamata è strettamente bloccante: sia Socket, che DatagramSocket (oltre alla ServerSocket) hanno un metodo chiamato setSoTimeout() che imposta, appunto, un timeout. La chiamata alla receive(), quindi, attenderà l'arrivo di un pacchetto fino allo scadere del timeout (in millisecondi). Se non arriva nulla entro il tempo prestabilito, la chiamata termina (e viene lanciata una SocketTimeOutException), che potrai catturare per, eventualmente, impostare a false il flag della guardia.
    Ma questo è vero solo se hai dei vincoli temporali,ad esempio, voglio che il server si spenga dopo 8 ore che l'ho acceso.
    E se voglio spegnerlo prima?
    Devo a forza cambiare il flag della boolean del while se non voglio ucciderlo brutalmente.
    by yakino @doc

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.