Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Server Socket

  1. #1

    Server Socket

    Buongiorno a tutti

    Avrei una domanda:

    E' possibile determinare lato server se un client si è disconnesso ???

    Ho gestito le connessioni socket lato server in multithread in questo modo:

    codice:
    try {
        ServerSocket server = new ServerSocket(33333);
            
        // ciclo infinito, in attesa di connessioni
        while(true){
        // chiamata bloccante, in attesa di una nuova connessione
        Socket client = server.accept();
                    
        // la nuova richiesta viene gestita da un thread indipendente, si ripete il ciclo
        LogicServer newClientConnection = new LogicServer (client);
        }
    
    
    }catch(Exception e){
           e.printStackTrace();
    }
    
    
    
    //Nella classe LogicServer invece
    
    public class LogicServer extends Thread
    {
        // dichiarazione delle variabili socket e dei buffer
        Socket client;
        BufferedReader in;
        PrintWriter out;
        
        public LogicServer (Socket client)
        {
            this.client = client;
            
            // invoca automaticamente il metodo run()
            this.start();
        }
        
        public void run()
        {
            try
            {
                // inizializza i buffer in entrata e uscita
                 ........
    
          while(true)
    
                 ........
    IL thread che poi gestisce la connessione (LogicServer) e che esegue una logica, presenta come si evince dal codice un while(true) questo perché non deve chiudere la connessione socket ad ogni richiesta ma restare sempre attivo perché è mia esigenza che mandi messaggi in continuazione verso il client.

    Il Problema è: inutile tenere thread aperti se poi i client sono disconnessi. Ovviamente essendo presente il while(true) i mio thread risulta sempre attivo. Il mio obbiettivo è far morire il thread uscendo dal ciclo while, non appena viene rilevata una disconnessione lato client.

    E' possibile fare una cosa del genere ???
    Grazie a tutti

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Immagino che da qualche parte tu utilizzi la socket (quindi, otterrai l'InputStream e/o l'OutputStream).
    Bene... se la connessione cade (perchè il client si è disconnesso o è caduta fisicamente la linea), al primo tentativo di utilizzo di uno dei due canali otterrai una eccezione. E, se immagino correttamente, tu il canale di Input lo usi "costantemente", ovvero immagino che tu rimanga in perenne attesa di input dal client. In quel caso, appena cade la connessione, la read() genera un'eccezione. Questo è l'unico modo per capire che il client si è disconnesso.

    PS: MAI USARE un while(true). Molto meglio un while(variabile) con variabile booleana... almeno puoi fermarlo programmaticamente impostando a false la variabile.


    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
    Ciao LeleFt

    Scusa per il post duplicato che ora non vedo più... mi è partito l'invio involontariamente e non sono riuscito ad eliminarlo.
    Il while(true) era solo un esempio veloce in realta usa una variabile che utilizzo poi per stoppare il servizio.

    Diciamo che lo scenario è questo. Il server invia in continuazione al client... ma allo stesso tempo si mette in ascolto di eventuali richieste dal client. L'inverso insomma.
    Credo che cmq il tuo discorso non cambi quindi dovrei intercettare semplicemente un errore in scrittura da parte del server ???

    Faccio presente che devo inviare xml su socket e che uso PrintWriter per scrivere(flush) magari potresti suggerirmi una soluzione migliore ??

    Grazie per la disponibilità

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da SHARKSEAL Visualizza il messaggio
    Ciao LeleFt

    Scusa per il post duplicato che ora non vedo più... mi è partito l'invio involontariamente e non sono riuscito ad eliminarlo.
    Il while(true) era solo un esempio veloce in realta usa una variabile che utilizzo poi per stoppare il servizio.
    No problem, l'ho rimossa io.

    Diciamo che lo scenario è questo. Il server invia in continuazione al client... ma allo stesso tempo si mette in ascolto di eventuali richieste dal client. L'inverso insomma.
    Credo che cmq il tuo discorso non cambi quindi dovrei intercettare semplicemente un errore in scrittura da parte del server ???
    Esatto. Se tenti di scrivere su un OutputStream che è chiuso (per qualunque motivo esso sia chiuso), riceverai una IOException.

    Faccio presente che devo inviare xml su socket e che uso PrintWriter per scrivere(flush) magari potresti suggerirmi una soluzione migliore ??
    PrintWriter è l'ideale per flussi di testo, quindi va benissimo.

    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

  5. #5
    Ok grazie gentilissimo

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.