8

Tôi đang sử dụng 'protobuf' cho chương trình mạng C/S bằng TCP.có protobuf cần tiêu đề gói mạng không?

đây là các bước của tôi cho khách hàng:

1, dữ liệu gói vào một 'protobuf'

2, có kích thước tính bằng byte của gói và xây dựng một khung thời gian-prefix

3, viết khung + gói đến socket

và sau đó máy chủ:

1, đọc khung chiều dài prefix từ ổ cắm và nhận được chiều dài N

2, đọc N byte từ ổ cắm và điền dữ liệu vào protobuf dụ

3, nhận được "giá trị" s từ protobuf bởi "chìa khóa" s

nó có vẻ hơi phức tạp Tôi nghĩ, là có một loại khung tiền tố có độ dài được tạo tự động cho protobuf, sau đó tôi không cần tự mình xây dựng. hoặc bất cứ điều gì khác tôi có thể làm để làm sạch mã?

+0

Câu hỏi của bạn không rõ ràng/không rõ ràng. Bạn đang sử dụng TCP? UDP? IP? hoặc một số giao thức mạng khác? Thật khó để nói protobuf là gì. Nó là một cấu trúc hay chỉ là một blob dữ liệu? Hầu hết các ứng dụng C/S sẽ yêu cầu một số trợ giúp để tìm hiểu tính chính xác của dữ liệu được gửi hoặc nhận. Bạn cần phải cụ thể hơn và hiển thị mã. –

+0

cảm ơn đề xuất của bạn, tôi sẽ làm cho nó rõ ràng hơn. 'protobuf' đề cập cụ thể đến dự án mã nguồn mở google. – Shawn

Trả lời

5

với protobuf, và giả sử bạn đang gửi nhiều thông điệp xuống đường ống cùng, sau đó: yes - bạn sẽ cần phải có độ dài là tiền tố, nếu không nó sẽ muốn đọc đến cuối luồng.

protobuf bao gồm một số RPC stubs cơ bản, nhưng triển khai RPC mà chúng sử dụng không phải là một phần của dự án PMNM, do đó không có sẵn. Có một số ngăn xếp RPC protobuf độc lập listed in the implementations.

Cá nhân, tôi có xu hướng giả vờ rằng chuỗi dữ liệu là một phần của chuỗi repeated - tức là tiền tố có "trường 1, chuỗi" (aka 0a) và độ dài là "varint" được mã hóa. Điều này có nghĩa là toàn bộ luồng mạng là luồng protobuf hợp lệ. Điều đó có thể chỉ là OCD của tôi đá vào, mặc dù.

Một số triển khai có thể có các tính năng được bao gồm để trợ giúp việc này. Ví dụ: protobuf-net (một trong các phiên bản .NET) có các phương thức SerializeWithLengthPrefix/DeserializeWithLengthPrefix cho phép thư viện thực hiện việc này cho bạn (đồng thời cung cấp một loạt các định dạng cho lựa chọn của bạn).

3

Tôi không biết điều này có phù hợp với nhiệm vụ của bạn hay không, nhưng tôi sẽ xem xét một trong các 'triển khai rpc' đã được viết cho (các) ngôn ngữ bạn muốn hỗ trợ.

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

ví dụ: Tôi đã có kết quả tốt trong Java với sự hỗ trợ tích hợp của Netty để gửi MessageLite phiên bản của một loại đã cho: http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(Tôi chắc chắn tiêu đề chiều dài của bạn sẽ thực hiện công việc OK, nhưng các khung như Netty sẽ thêm hỗ trợ cho những thứ như không đồng bộ 'duplex' IO, SSL, xác thực, vv, một cách dễ dàng tương đối)

HTH

+0

RPC dựa trên protobuf là một giải pháp tốt. và tôi vẫn tò mò về việc có bất kỳ giải pháp protobuf thuần túy nào không. – Shawn

+0

đó là điều. Tôi nghĩ rằng điều này nằm ngoài phạm vi của protobuf. Nó chỉ là một cơ chế tuần tự hóa, độc lập với việc vận chuyển hoặc lưu trữ. Nhiều cơ chế truyền tải (ví dụ: một thông báo trong một tệp) không cần phải hỗ trợ nhiều thư hoặc cung cấp các cơ chế kiểm tra tính toàn vẹn của riêng chúng. – laher

Các vấn đề liên quan