2015-02-26 4 views
7

Uso Dart 1.8.5 sul server. Voglio implementare TCP Socket Server che ascolta le connessioni in entrata, invia alcuni dati a ogni client e si ferma a generare dati quando il client si disconnette.Come gestire il socket si disconnette in Dart?

Ecco il codice di esempio

void main() { 
    ServerSocket.bind(
     InternetAddress.ANY_IP_V4, 
     9000).then((ServerSocket server) { 
    runZoned(() { 
     server.listen(handleClient); 
    }, onError: (e) { 
     print('Server error: $e'); 
    }); 
    }); 
} 

void handleClient(Socket client) { 
    client.done.then((_) { 
    print('Stop sending'); 
    }); 
    print('Send data'); 
} 

Questo codice accetta le connessioni e le stampe "Invia i dati". Ma non stamperà mai "Interrompi invio" anche se il cliente era sparito.

La domanda è: come intercettare il client in ascolto?

+2

Per me questo sembra un bug. Crea un problema su http://dartbug.com –

+2

https://code.google.com/p/dart/issues/detail?id=22583 – lig

+0

Puoi vedere un esempio nella mia risposta. Visualizza 'Interrompi invio 'e nei detals espande il problema riscontrato nell'SDK Dart. – mezoni

risposta

4

A Lo zoccolo è bidirezionale, ovvero ha un flusso di input e un sink di uscita. Il futuro restituito da done viene chiamato quando il sink di output viene chiuso chiamando Socket.close().

Se si desidera ricevere una notifica quando si chiude il flusso di input, provare a utilizzare Socket.drain().

Vedere l'esempio di seguito. Puoi testarlo con telnet. Quando ti connetti al server invierà la stringa "Invia". ogni secondo. Quando chiudi telnet (ctrl-], quindi digita close). Il server stamperà "Stop".

import 'dart:io'; 
import 'dart:async'; 

void handleClient(Socket socket) { 

    // Send a string to the client every second. 
    var timer = new Timer.periodic(
     new Duration(seconds: 1), 
     (_) => socket.writeln('Send.')); 

    // Wait for the client to disconnect, stop the timer, and close the 
    // output sink of the socket. 
    socket.drain().then((_) { 
    print('Stop.');  
    timer.cancel(); 
    socket.close(); 
    }); 
} 

void main() { 
    ServerSocket.bind(
     InternetAddress.ANY_IP_V4, 
     9000).then((ServerSocket server) { 
    runZoned(() { 
     server.listen(handleClient); 
    }, onError: (e) { 
     print('Server error: $e'); 
    }); 
    }); 
}