Le persone scrivono i propri codificatori/decodificatori (codec) perché Netty non impone né definisce un protocollo a livello di applicazione, in modo che sia libero di scrivere il proprio protocollo. Il set di codec che definisci è un protocollo che può essere qualsiasi cosa tra String based e alcuni formati binari come Protobuf, ad esempio. Netty fornisce i codec per la tua comodità (quelli che hai usato sono esempi).
Suppongo che ciò consenta di interrompere anticipatamente lo streaming?
Di solito, quando si inviano/ricevono flussi, è necessario scomporre che su un fisso pezzi di lunghezza (chiamato frame). Un approccio popolare, che è stato utilizzato sin dagli albori di Internet, è quello di utilizzare la lunghezza del blocco (di solito un 4 byte int) come il primo campo letto dal flusso. Quindi se il valore del primo int è 20 allora si sa che i seguenti 20 byte sono il carico utile (i dati) e il 21 ° byte è il primo byte di un'altra lunghezza. Il vantaggio di questo approccio è che consente blocchi di lunghezza variabile. Ma tu non sei limitato a questo. Ad esempio, se si pianifica di scrivere un protocollo che utilizza stringhe con lunghezza predefinita (con padding), si scriverà o, meglio ancora, si useranno i codec attuali di Netty ad esso appropriati.
volta, ho implementato un protocollo con tre decodificatori che svolgerà in questo ordine:
- ricevere un flusso e si decompongono in frame di lunghezza prefissata;
- convertire ciascun frame in una stringa;
- usa libray Jackson per convertire una stringa in un oggetto Java predefinito.
Gli encoder eseguivano solo le stesse operazioni, ma all'indietro. Sfortunatamente, ho perso il codice originale, ma lo riscriverò presto.
Ma come fa il torrente sa che il flusso è una stringa o una serie di int di o una serie di doppi? Come fai a dire che la differenza è la domanda?
Risposta breve: non lo so. Devi codificare queste informazioni nei codec. Ad esempio, è possibile utilizzare un codice operativo come primo campo nel payload che indica che il carico utile è Stringhe, doppi, intarsi o qualsiasi combinazione di entrambi.
Fondamentalmente, Netty fornisce un flusso e sei libero di decodificare come preferisci. Ad esempio, se stai leggendo una serie di long (8 byte), allora stai andando a scrivere un codec che legge 64 byte alla volta dal flusso perché ognuno rappresenta un singolo lungo. Netty fornisce i codec out-of-box in modo che non sia necessario reinventare la rotella ogni volta.
Vorrei aggiungere che sto facendo riferimento alla Netty API e al modo in cui utilizza i decodificatori e gli encoder in realtà ... Mi sembra che la guida non fornisca dettagli sull'implementazione dei propri decoder e su come .. Anche io voglio ribadire come ho detto quest'ultima volta. Ho continuato a battermi per un po 'e non riesco a capire questo ... – Maxs728