usar codigo java c++ http protocol-buffers

codigo - border title java



Búfers de Protocolo de Google y HTTP (5)

Estoy refaccionando el sistema heredado de C ++ a SOA usando gSoap. Tenemos algunos problemas de rendimiento (XML muy grandes) así que mi guía me pidió que echara un vistazo a los búferes de protocolo. Lo hice, y se ve muy bien (necesitamos compatibilidad con C ++ y Java). Sin embargo, los búferes de protocolo son una solución solo para la serialización y ahora debo enviarlos al front-end de Java. ¿Qué debería usar desde la perspectiva de C ++ y Java para enviar esas cosas en serie a través de HTTP (solo red interna)?

PD. Otro chico intenta acelerar nuestra solución gSoap, solo estoy interesado en los búferes de protocolo.


Ciertamente puede enviar incluso una carga binaria con una solicitud HTTP, o en una respuesta HTTP. Simplemente escriba los bytes del búfer de protocolo directamente en la solicitud / respuesta, y asegúrese de establecer el tipo de contenido en "application / octet-stream". El cliente y el servidor deberían poder encargarse del resto fácilmente. No creo que necesites nada más especial que eso en cualquier extremo.


Las application/protobuf Google prefieren application/protobuf .

El ProtocolBufferModel del cliente API de Google usa application/x-protobuf .


Por lo que sé, el soporte de búfers de protocolo está disponible tanto en C ++ como en Java, debería poder intercambiar datos serializados de búfer de protocolo entre ambos sistemas.

Dicho esto, parece que su verdadera pregunta es "¿Cómo envío cosas a través de HTTP entre un backend de C ++ y un cliente de Java"?

Parece que necesita aprender a usar gSOAP, lea los docs .

Alternativamente, podría alojar un servidor web RESTful desde su aplicación C ++: Mire esto: https://.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

A continuación, tendrá que acceder a los datos alojados en su nuevo servidor RESTful de C ++: Mire esto: ¿ Descansa clientes para Java?


ProtoBuf es un protocolo binario. No se combina bien con SOAP. Sugiero que te quedes con gSOAP o que conviertas a ProtoBuf por completo.

Con protoBuf, usted define su protocolo en un formato especial como este,

message Product { required string id = 1; required string description = 2; required int32 quantity = 3; optional bool discontinued = 4; }

La herramienta de protoc puede generar código en C ++ / Java / Python para que pueda serializarlo en un extremo y deserializarlo en otro.

Como puede ver, ProtoBuf está diseñado para serializar objetos individuales. No proporciona todas las facilidades proporcionadas por SOAP, como los encabezados. Para evitar este problema, usamos ProtoBuf dentro de ProtoBuf. Definimos un sobre como este,

message Envelope { enum Type { SEARCH = 1; SEARCH_RESPONSE = 2; RETRIEVE = 3; RETRIEVE_RESPONSE = 4; } required Type type = 1; required bytes encodedMessage = 2; message Header { required string key = 1; required bytes value = 2; } repeated Header headers = 3; }

El encodedMessage es otro mensaje serializado de ProtoBuf. Todas las cosas en el encabezado SOAP ahora van a los headers .


Puede serializar / deserializar datos codificados de protobuf a / desde cadenas. Envíe la cadena serializada como el cuerpo de un HTTP POST a Java y deserialícese. Ese es un enfoque. Otra forma es hacer uso de la interfaz de servicio protobuf. Protobuf le permite definir una interfaz de servicio en un archivo .proto y el compilador de búfer de protocolo generará código de interfaz de servicio y stubs en el idioma elegido. Solo necesita implementar las clases protobuf :: RpcChannel y protobuf :: RpcController para obtener un marco completo de RPC. Probablemente pueda escribir un contenedor HTTP para estas clases. Vea los siguientes enlaces para más información:

http://code.google.com/apis/protocolbuffers/docs/proto.html#services http://code.google.com/apis/protocolbuffers/docs/reference/cpp-generated.html#service http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.service.html