Вопрос

Я рефакторингую устаревшую систему C ++ на SOA, используя gSOAP.У нас есть некоторые проблемы с производительностью (очень большие XML-файлы), поэтому мой руководитель попросил меня взглянуть на буферы протокола.Я сделал, и это выглядит очень круто (нам нужна поддержка C ++ и Java).Однако буферы протокола - это решение только для сериализации, и теперь мне нужно отправить его во внешний интерфейс Java.Что я должен использовать с точки зрения C ++ и Java для отправки этих сериализованных данных по HTTP (только по внутренней сети)?

PS.Другой парень пытается ускорить наше решение gSOAP, меня интересуют только буферы протокола.

Это было полезно?

Решение

Вы, конечно, можете отправить даже двоичную полезную нагрузку с HTTP-запросом или в HTTP-ответе.Просто запишите байты буфера протокола непосредственно в запрос / ответ и убедитесь, что для типа содержимого задано значение "application / octet-stream".Клиент и сервер должны быть в состоянии легко позаботиться обо всем остальном.Я не думаю, что вам нужно что-то более особенное, чем это, с обеих сторон.

Другие советы

ProtoBuf - это двоичный протокол.Он плохо смешивается с МЫЛОМ.Я предлагаю вам либо придерживаться gSOAP, либо полностью перейти на ProtoBuf.

С помощью protoBuf вы определяете свой протокол в специальном формате, подобном этому,

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

В protoc инструмент может генерировать код на C ++ / Java / Python, чтобы вы могли сериализовать его на одном конце и десериализовать на другом.

Как вы можете видеть, ProtoBuf предназначен для сериализации отдельного объекта.Он не предоставляет всех возможностей, предоставляемых SOAP, таких как заголовки.Чтобы обойти эту проблему, мы используем ProtoBuf внутри ProtoBuf.Мы определяем Конверт следующим образом,

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;
}

В encodedMessage это еще одно сериализованное сообщение ProtoBuf.Весь материал в заголовке SOAP теперь переходит в headers.

Интерфейсы Google предпочитают application/protobuf.

В Модель ProtocolBufferModel из того, что использует клиент Google API application/x-protobuf.

Вы можете сериализовать / десериализовать данные, закодированные в protobuf, в / из строк.Отправьте сериализованную строку в качестве тела HTTP-СООБЩЕНИЯ в Java и десериализуйте ее.Это один из подходов.Другой способ - использовать интерфейс сервиса protobuf.Protobuf позволяет вам определить интерфейс сервиса в файле .proto, а компилятор буфера протокола сгенерирует код интерфейса сервиса и заглушки на выбранном вами языке.Вам нужно только реализовать классы protobuf::RpcChannel и protobuf::RpcController, чтобы получить полную структуру RPC.Вероятно, вы можете написать HTTP-оболочку для этих классов.Смотрите следующие ссылки для получения дополнительной информации:

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

Насколько мне известно, поддержка буферов протокола доступна как в C ++, так и в Java, вы должны иметь возможность обмениваться сериализованными данными буфера протокола между обеими системами.

Тем не менее, похоже, ваш реальный вопрос заключается в том, "Как мне отправлять данные по HTTP между серверной частью C ++ и Java-клиентом".

Похоже, вам нужно научиться использовать gSOAP, прочитать Документы.

В качестве альтернативы вы могли бы разместить веб-сервер RESTful из вашего приложения на C ++:Посмотри на это: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c ++

Затем вам нужно будет получить доступ к данным, размещенным на вашем новом сервере C ++ RESTful:Посмотри на это: Клиенты Rest для Java?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top