Questo modulo poggia sull'infrastruttura di asyncore, semplificando client e server asincroni e rendendo facile la gestione di protocolli i cui elementi siano terminati da stringhe arbitrarie, o di lunghezza variabile. asynchat definisce la classe astratta async_chat che sarà la vostra sotto classe, e fornirà l'implementazione dei metodi collect_incoming_data() e found_terminator(). Utilizza lo stesso ciclo asincrono di asyncore, e i due tipi di canale, asyncore.dispatcher e asynchat.async_chat possono essere liberamente mescolati nella mappa dei canali. Tipicamente un canale di server asyncore.dispatcher genera un nuovo oggetto canale asynchat.async_chat appena riceve una richiesta di connessione in ingresso.
) |
Come asyncore.dispatcher, async_chat definisce un insieme di eventi che vengono generati da una analisi delle condizioni del socket dopo una chiamata a select(). Una volta che il ciclo di controllo è stato avviato, i metodi dell'oggetto async_chat vengono chiamati dalla struttura di gestione eventi senza alcuna azione da parte del programmatore.
Diversamente da asyncore.dispatcher, async_chat permette di definire una fifo dei producers. Un producer necessita di un solo metodo, more(), che dovrà restituire dati che saranno trasmessi sul canale. Il producer indica esaurimento (per esempio non ci sono più dati) con il proprio metodo more() che restituisce una stringa vuota. A questo punto l'oggetto async_chat rimuove il producer dalla coda fifo e si avvia usando il successivo producer, se è disponibile. Quando la coda fifo del producer è vuota il metodo handle_write() non fa nulla. Utilizzare il metodo set_terminator() dell'oggetto canale per descrivere come riconoscere la sua fine, o un importante punto di interruzione, su una trasmissione in arrivo da un punto remoto.
Per costruire una sotto classe async_chat funzionale, i metodi collect_incoming_data() e found_terminator() devono gestire i dati che il canale riceve in modo asincrono. I metodi vengono descritti più avanti.
) |
None
nella coda fifo del producer. Quando
questo producer viene estratto dalla coda fifo causerà la chiusura
del canale.
data) |
) |
) |
) |
) |
) |
) |
data) |
producer_fifo
del canale per
assicurare la sua trasmissione. Questo è tutto quello che si deve
fare per far si che il canale scriva i dati fuori, verso la rete,
altrimenti è possibile utilizzare un proprio producer in un più
complesso schema per implementare per esempio criptazione e
frammentazione.
producer) |
) |
True
per il canale che deve essere incluso
nell'insieme dei canali testati dal ciclo di select()
per leggibilità.
) |
None
, il canale viene
chiuso.
term) |
term
può essere uno dei tre tipi di valore,
corrispondenti ai tre differenti modi di gestire i dati del
protocollo in arrivo.
term | Descrizione |
---|---|
string | Chiamerà found_terminator() quando la stringa viene trovata nel flusso in entrata |
integer | Chiamerà found_terminator() quando saranno stati ricevuti il numero di caratteri indicato |
None |
Il canale continua a raccogliere dati per sempre |
Notare che ogni dato seguito dalla stringa di conclusione sarà disponibile per la lettura da parte del canale dopo che verrà chiamato found_terminator().
) |
True
tanto a lungo quanto l'elemento
resta nella coda fifo del producer, o il canale è connesso ed il
buffer di uscita del canale non è vuoto.