8

Estoy usando 'protobuf' para el programa de red C/S usando TCP.¿necesita protobuf un encabezado de paquete de red?

aquí es mis pasos para el cliente:

1, los datos de paquete en un 'protobuf'

2, obtener el tamaño en bytes del paquete y construir un marco de longitud-prefix

3, escribir el bastidor + empacar al enchufe

y entonces el servidor:

1, leer marco longitud-prefijo de toma de corriente y obtener la longitud N

2, leído N bytes de zócalo y llenar los datos en caso protobuf

3, obtener el "valor" s de protobuf por "clave" s

parece un poco complicado pienso, ¿hay algún tipo de marco de prefijo de longitud autogenerado para protobuf, entonces no necesito construir uno solo. o cualquier otra cosa que pueda hacer para hacer un código más limpio?

+0

Su pregunta es ambigua/confusa. ¿Estás usando TCP? UDP? IP? o algún otro protocolo de red? Es difícil saber qué es protobuf. ¿Es una estructura o simplemente una masa de datos? La mayoría de las aplicaciones C/S requerirán cierta ayuda para determinar la cordura de los datos que se enviarán o recibirán. Debes ser más específico y mostrar el código. –

+0

gracias por su sugerencia, voy a dejarlo más claro. 'protobuf' se refiere en particular a un proyecto de fuente abierta de google. – Shawn

Respuesta

5

con protobuf, y suponiendo que va a enviar varios mensajes por el mismo tubo, entonces: sí - que tendrá que tener una longitud como prefijo; de lo contrario, querrá leer hasta el final de la secuencia.

protobuf incluye algunos stubs de RPC, pero la implementación de RPC que utilizan no es parte del proyecto de OSS, por lo que no está disponible. Sin embargo, hay algunas pilas RPC protobuf independientes listed in the implementations.

Personalmente, tiendo a pretender que la secuencia de datos es parte de una secuencia repeated - es decir, prefijo con "campo 1, cadena" (también conocido como 0a), y la longitud como "varinta" codificada. Esto significa que toda la transmisión de red es una secuencia protobuf válida. Sin embargo, ese podría ser mi TOC.

Algunas implementaciones pueden tener características incluidas para ayudar con esto. protobuf-net (una de las versiones de .NET) tiene SerializeWithLengthPrefix/DeserializeWithLengthPrefix métodos, por ejemplo, que le permite a la biblioteca hacer esto por usted (mientras ofrece una gama de formatos para su elección).

3

No sé si esto es apropiado para su tarea, pero buscaría en una de las 'implementaciones de rpc' ya escritas para el (los) idioma (s) que desea admitir.

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

por ejemplo He obtenido buenos resultados en Java con el soporte integrado de Netty para enviar instancias MessageLite de un tipo determinado: http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(Estoy seguro de que su encabezado de longitud hará el trabajo bien, pero marcos como Netty agregarán soporte para cosas como asíncrona 'duplex' IO, SSL, autenticación, etc., con relativa facilidad)

HTH

+0

RPC basado en protobuf es una buena solución. y todavía tengo curiosidad acerca de si hay alguna solución protobuf pura. – Shawn

+0

esa es la cosa. Creo que esto está fuera del alcance de protobuf en sí. Es solo un mecanismo de serialización, independiente del transporte o el almacenamiento. Muchos mecanismos de transporte (por ejemplo, un mensaje en un archivo) no necesitan admitir múltiples mensajes o proporcionar sus propios mecanismos de verificación de integridad. – laher

Cuestiones relacionadas