8

Używam "protobuf" dla programu sieciowego C/S za pomocą protokołu TCP.czy protobuf potrzebuje nagłówka pakietu sieciowego?

tutaj jest moje kroki dla klienta:

1, danych opakowań w „Protobuf”

2, uzyskać rozmiar w bajtach opakowanie i konstruować ramkę długości prefiksu

3, Napisać ramkę + zapakować do gniazda

a następnie serwer:

1, przeczytaj ramkę Długość prefiksu z gniazdka i uzyskać długość N

2, czytać N bajtów z gniazdem i wypełnić dane do Protobuf przykład

3, dostać „wartość” s od Protobuf przez „klucz” s

wydaje się nieco skomplikowany jak sądzę, jest tam jakiś rodzaj automatycznie generowanej ramki prefiksów długości dla protobuf, wtedy nie potrzebuję jej samemu konstruować. czy cokolwiek innego mogę zrobić, aby uczynić kod czystszy?

+0

Twoje pytanie jest niejednoznaczne/niejasne. Czy używasz TCP? UDP? IP? lub jakiś inny protokół sieciowy? Trudno powiedzieć, czym jest protobuf. Czy to struktura, czy tylko kropelka danych? Większość aplikacji C/S będzie wymagać pomocy w ustaleniu poprawności danych wysyłanych lub odbieranych. Musisz być bardziej konkretny i pokazać kod. –

+0

dzięki za sugestię, sprawię, że stanie się to bardziej jasne. "protobuf" odnosi się w szczególności do projektu opensource google. – Shawn

Odpowiedz

5

z protobuf i zakładając wysyłania wielu wiadomości w dół tej samej rury, a następnie: tak - trzeba będzie mieć długość jako przedrostek, w przeciwnym razie będzie chciał przeczytać na końcu strumienia.

protobuf zawiera niektóre podstawowe kody RPC , ale implementacja RPC, której używają, nie jest częścią projektu OSS, więc nie jest dostępna. Istnieje jednak kilka autonomicznych stosów RPC protobuf listed in the implementations.

Osobiście staram się udawać, że sekwencja danych jest częścią sekwencji repeated - tj. Prefiks z "polem 1, ciągiem" (aka 0a), a długość jako "varint" zakodowana. Oznacza to, że cały strumień sieciowy jest prawidłowym strumieniem protobuf. To może być jednak moje OCD.

Niektóre implementacje mogą zawierać funkcje pomocne w tym zakresie. protobuf-net (jedna z wersji .NET) ma na przykład metody SerializeWithLengthPrefix/DeserializeWithLengthPrefix, które pozwalają bibliotece zrobić to za Ciebie (oferując gamę formatów do wyboru).

3

Nie wiem, czy jest to odpowiednie dla twojego zadania, ale zajrzałbym do jednej z "implementacji rpc", napisanych już dla języków, które chcesz obsługiwać.

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

np Mam dobre wyniki w Javie z wbudowaną obsługą Netty do wysyłania MessageLite instancji danego typu: http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(Jestem pewien, że twój nagłówek długości wykona zadanie OK, ale frameworki takie jak Netty dodadzą wsparcie dla rzeczy takie jak asynchronicznym „duplex” IO, SSL, uwierzytelnianie, itp, z względną łatwością)

HTH

+0

RPC oparte na protobuf jest dobrym rozwiązaniem. i nadal jestem ciekawa, czy istnieją jakieś czyste rozwiązania protobuf. – Shawn

+0

to jest to. Myślę, że wykracza to poza zakres samego protobuf. To tylko mechanizm szeregowania, niezależny od transportu lub przechowywania. Wiele mechanizmów transportu (na przykład jedna wiadomość w pliku) nie musi obsługiwać wielu wiadomości lub zapewniać własnych mechanizmów sprawdzania integralności. – laher

Powiązane problemy