2013-03-14 14 views
7
private val in = new BufferedReader(new InputStreamReader(con.getInputStream())) 
    private val out = new PrintWriter(con.getOutputStream(), true) 
    try { 
    while (true) { 
     if (in.readLine() == null) 
     throw new IOException("connection reset by peer") 
    } 
    } catch { 
    case e: Exception => 
    } finally { 

    // Is this necessary? 
    in.close() 
    out.close() 

    // Close socket 
    con.shutdownInput() 
    con.shutdownOutput() 
    con.close() 
    } 

Se uno o più flussi IO o lettori/scrittori vengono creati dall'ingresso o dallo stream del socket, è necessario chiuderli prima o dopo aver chiuso il socket?È necessario chiudere i flussi di input/output creati dai flussi IO di un socket quando si chiude il socket?

+3

È una buona pratica chiuderle. Saranno comunque chiusi quando la presa è chiusa. –

+1

Sono d'accordo con Sudhanshu: è una buona pratica. Inoltre, dovresti usare anche try/catch qui: immagina 'in.close()' fallisce: 'out' e' con'rema apre. – Claude

+0

Ummm .... questo NON è il codice Java ... –

risposta

6

Se uno o più flussi IO o lettori/scrittori vengono creati dall'ingresso o dallo streaming del socket, è necessario chiuderli prima o dopo aver chiuso il socket?

Si consiglia di chiudere il più esterno OutputStream o Writer che si è creato dal flusso di output del socket. Ciò svuota il flusso e chiude il socket e il suo flusso di input. La chiusura di qualsiasi altro aspetto del socket, come il suo flusso di output diretto, il suo flusso di input o qualsiasi cosa attorno a esso, o il socket stesso, realizza la maggior parte ma non la totalità: in particolare, chiudendo il flusso di input prima del flusso di output come avete nell'esempio impedisce il flusso di output che viene svuotato e quindi può perdere dati.

Chiamare shutdownInput() o shutdownOutput() immediatamente prima che una chiusura sia sempre ridondante.

5

Dal Socket Javadoc:

chiusura di questa presa anche chiudere InputStream del socket e OutputStream.

Ovviamente, tutti i lettori/scrittori che il codice è stato esplicitamente aperto devono essere esplicitamente chiusi, ma per quanto riguarda le risorse di rete, verranno rilasciati a prescindere.

Per quanto riguarda l'ordine delle azioni, si applicano le regole standard: ultima da aprire -> prima da chiudere. Quindi chiudere definitivamente tutti i tuoi lettori/scrittori prima del chiudendo la connessione socket sottostante.

+0

grazie. Dato che sono automaticamente chiusi, penso che https://github.com/technomancy/server-socket/blob/master/src/server/socket.clj non sia aggiornato. –

+1

Questa non è la risposta all'intera domanda dell'OP - sta anche chiedendo cosa si dovrebbe fare per i lettori e gli scrittori creati da quei flussi. – SpaceTrucker

+1

Ho appena studiato il codice sorgente di 'InputStreamReader',' BufferedReader' e 'PrintWriter'. Hanno tutti "assicurato" il flusso sottostante prima di fare qualsiasi IO effettivo. Con il flusso sottostante chiuso, (secondo la mia comprensione) diventano oggetti spazzatura e saranno GCed. –

0

Non è necessario in questo caso, ma non fa male.

Tuttavia, se non si è impostato il flag "AutoFlush" nel costruttore PrintWriter, quindi se non avete fatto chiudere o lavare la Writer prima di chiudere il Socket, alcuni dati potrebbero non essere inviati. (E se hai chiuso nell'ordine sbagliato, potresti ottenere un'eccezione!)

Per i lettori/flussi di input questo non è un problema. Hai già deciso di ignorare qualsiasi input bufferizzato.


Non vi sono problemi con perdite di risorse (descrittori di file). Se il socket è chiuso, tutte le risorse di I/O vengono rilasciate. Non è necessario chiamare shutdownInput o shutdownOutput. La chiusura dello Socket lo farà.

+0

Dal punto di vista delle buone pratiche, raccomandi che i lettori/scrittori vengano chiusi esplicitamente? –

+0

Beh ... non lo consiglierei. Non vedo alcun punto nel fare qualcosa che è ovviamente (per me) ridondante. Tuttavia, come ho detto, non c'è alcun danno reale nel farlo. Quindi se i monitor delle "migliori pratiche" dicono "BASTA FARLO" ... non discutere. :-) –

+0

O, per dirla in altro modo, se non si riesce a capire se è necessario o meno, chiudendo tutti i flussi in ordine inverso che essi sono stati aperti è ... sicura. –

Problemi correlati