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.