Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    18

    [Java]

    Sto scrivendo un server in java, il thread principale si occupa solamente di accettare connessioni con i client tenendone traccia (con i Socket restituiti da accept) in un ArrayList<Socket> e poi ne delega la gestione del protocollo di comunicazione ad un altro thread.
    Il mio problema è come far sapere al server principale che un client si è disconnesso (ad esempio un client telnet che chiude telnet senza seguire il protocollo).

    Qualcuno ha qualche idea? o mi devo basare solamente sul protocollo (ad esempio su un comando quit)? oppure devo solamente usare i timeout?

    Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Manca il titolo della discussione.

    Lo aggiungo io.


    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
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Per sapere se un client si disconnette è necessario intercettare (sul server) l'eccezione che viene sollevata alla sua disconnessione: SocketException.

    Quando un client si disconnette perchè, ad esempio, cade la linea, viene sollevata una SocketException o una più generica IOException se era in corso una operazione di lettura/scrittura dalla/sulla socket.

    Altrimenti, se utilizzi un tuo protocollo personalizzato, puoi prevedere un comando che viene inviato dal client al momento della disconnessione.


    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
    Sep 2008
    Messaggi
    18
    Io utilizzo l'operazione di lettura readLine() e non mi genera alcuna eccezione.
    Mi spiego meglio:
    codice:
    BufferedReader in = null;
    try {    
        in = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
    
        String tmp1 = in.readLine();
        String tmp2 = in.readLine();
    } catch (SocketTimeoutException ste) {
        out.println("Connection die for timeout.");
        stopRunning();
    } catch(SocketException se){ // anche se readLine() dichiara di generare IOException
        System.out.println("Client disconnesso: " + se);
    } catch (IOException ex) {
        System.out.println("Altro: " + ex);
    } finally {
        try {
            out.close();
            in.close();
            stopRunning();
        } catch (IOException ex) {
            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    praticamente se disconnetto il client alla seconda readLine() l'esecuzione passa direttamente al blocco finally.
    Dovrei forse utilizzare qualche altro metodo per la lettura? Dichiarato in qualche altro modo?


    PS: Scusa per il mancato titolo, l'avevo lasciato da riempire e poi me ne sono scordato.


    Sempre grazie.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Il problema è che BufferedReader intercetta la chiusura della socket come "terminazione della lettura" e restituisce, correttamente, null.

    In questo caso, quindi, puoi intercettare la chiusura di un client testando se le stringhe sono a null.


    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.