8

Sto usando 'protobuf' per il programma di rete C/S usando TCP.protobuf richiede un'intestazione di pacchetto di rete?

ecco i passi per il client:

1, i dati del pacchetto in un 'protobuf'

2, ottenere la dimensione in byte del pacchetto e costruire un telaio lunghezza prefisso

3, scrivere il telaio + pacco alla presa

e quindi il server:

1, lettura telaio lunghezza-prefix dalla presa di corrente e ottenere la lunghezza N

2, leggere N byte da presa e riempire i dati in esempio protobuf

3, ottenere "valore" s da protobuf da "chiave" s

sembra un po 'complicato Credo, c'è una sorta di frame con prefisso lunghezza generato automaticamente per protobuf, quindi non ho bisogno di costruirne uno da solo. o qualcos'altro che posso fare per rendere il codice più pulito?

+0

La tua domanda è ambigua/non chiara. Stai usando TCP? UDP? IP? o qualche altro protocollo di rete? È difficile dire cos'è protobuf. È una struttura o solo un blob di dati? La maggior parte delle applicazioni C/S richiederà un po 'di aiuto per capire la sanità dei dati da inviare o ricevere. Devi essere più specifico e mostrare il codice. –

+0

grazie per il tuo suggerimento, lo renderò più chiaro. 'protobuf' si riferisce in particolare a un progetto google opensource. – Shawn

risposta

5

con protobuf, e supponendo che si inviano più messaggi verso il basso lo stesso tubo, quindi: sì - sarà necessario avere una lunghezza come prefisso, altrimenti vorrebbe leggere fino alla fine del flusso.

protobuf include alcuni RPC di base stub, ma l'implementazione RPC che utilizzano non fa parte del progetto OSS, pertanto non è disponibile. Ci sono alcuni stack RPC protobuf standalone listed in the implementations però.

Personalmente, tendo a fingere che la sequenza di dati sia parte di una sequenza repeated - cioè prefisso con "campo 1, stringa" (alias 0a) e la lunghezza come "varint" codificata. Ciò significa che l'intero flusso di rete è un flusso protobuf valido. Tuttavia, potrebbe essere il mio OCD.

Alcune implementazioni possono avere funzionalità incluse per aiutare con questo. protobuf-net (una delle versioni .NET) ha i metodi SerializeWithLengthPrefix/DeserializeWithLengthPrefix, ad esempio, che consente alla libreria di fare ciò per te (pur offrendo una gamma di formati a tua scelta).

3

Non so se questo è appropriato per il tuo compito, ma guarderei in una delle "implementazioni rpc" già scritte per la lingua (s) che si desidera supportare.

http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns#RPC_Implementations

esempio Ho avuto buoni risultati in Java con il supporto integrato di Netty per l'invio di istanze MessageLite di un determinato tipo: http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(sono sicuro che l'intestazione della lunghezza farà il lavoro OK, ma framework come Netty aggiungeranno il supporto per cose come asincrono 'duplex' IO, SSL, l'autenticazione, ecc, con relativa facilità)

HTH

+0

RPC basato su protobuf è una buona soluzione. e sono ancora curioso di sapere se esistono soluzioni puramente protobuf. – Shawn

+0

questa è la cosa. Penso che questo sia al di fuori dello scopo di protobuf stesso. È solo un meccanismo di serializzazione, indipendente dal trasporto o dall'archiviazione. Molti meccanismi di trasporto (ad esempio un messaggio in un file) non devono supportare più messaggi o fornire i propri meccanismi di controllo dell'integrità. – laher