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

    [Java]Verificare se un client è connesso senza scrivere su socket

    Salve a tutti è un bel po' che non scrivo su questo forum.
    Ho un problema un po' singolare con un'applicazione client-server in Java.

    Ho realizzato un server multithread che riceve connessioni da un client remoto (tipicamente un cellulare GPRS).
    Questa socket viene aperta nel momento in cui l'utente comincia a navigare sul web. Il client però non invia nulla al server mentre il server deve aspettare che l'utente raggiunga una certa pagina di un sito web per inviare dei dati.

    In pratica il server per inviare i dati deve aspettare un evento (il click su un link da browser) che non è in alcun modo legato alla socket client, per cui il thread si mette in wait().
    Quando l'utente (dallo stesso cellulare su cui è aperta la socket) clicca sul link faccio notify() per risvegliarlo.

    C'è però il problema che se l'utente si disconnette (chiude la socket client o spegne il cellulare)
    non cliccherà mai sul link per cui il thread resta bloccato sulla wait()
    Ho bisogno quindi di un sistema per testare se il client è ancora connesso prima di inviare i dati.
    è possibile farlo senza che io debba inviare un pacchetto "dummy" sul canale?
    Avevo pensato di utilizzare il timeout al metodo wait(), e a quel punto verificare la connessione, ma il problema è che non posso inviare dati se l'utente non è passato per il link.
    Come si potrebbe fare?

    grazie a tutti...

  2. #2
    Credo tu debba testare questa situazione utilizzando il metodo isConnected della classe Socket

  3. #3
    ci ho provato, il metodo ritorna subito false, anceh se in realtà la socket client è ancora aperta.

    In realtà dalla documentazione del metodo isConnected() mi sembra di capire che si applica a una socket client

    codice:
    Returns the connection state of the socket.
    
        Returns:
            true if the socket successfuly connected to a server

  4. #4
    In effetti pare che isConnected dia true solo dopo che connect è stata chiamata.

    Azzardo un'ipotesi: e se provassi a settare il timeout con setSoTimeout e poi sostituire il wait che intendevi usare con la read? Se il client è connesso, dovresti ciclicamente rimanere bloccato sulla read e ottenere l'eccezione di timeout. Se il client si è disconnesso dovresti avere un IOException. Che ne pensi?

  5. #5
    Buona idea, penso che possa funzionare,
    dopo la provo. nel frattempo sto continuando lo sviluppo, almeno in questa fase posso gestire con un polling ogni minuto.
    Grazie ciaooo

  6. #6
    Se provi a farlo, fammi sapere l'esito

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.