Как определить длину данных полезной нагрузки RPC? - PullRequest
0 голосов
/ 20 сентября 2019

RPC может быть реализован многими способами.

И мы должны знать, что фиксированную полезную нагрузку RPC на самом деле сложно использовать.Разные методы RPC имеют различную полезную нагрузку RPC (параметр метода).

Я не совсем понимаю, как различать длину данных полезной нагрузки?

Например, ниже я разработал протоколы RPC с использованием JSON:

протокол 1:

{
  "method": "sayHello",
  "parameter": "UserName",
  "return": "Hello! UserName!"
}

метод 1:

std::string sayHello(const std::string &user_name);

протокол 2:

{
  "method": "sayBye",
  "parameter": "UserName",
  "return": "Goodbye! UserName"
}

метод 2:

std::string sayBye(const std::string &user_name);

Я собираюсь использовать библиотеку сериализации JSON для кодирования этой информации в строку, которая является моей полезной нагрузкой RPC.Например, длина полезной нагрузки метода 1 равна 20, длина полезной нагрузки метода 2 равна 34. Я использую сокет для отправки полезной нагрузки 2.

Тогда мой сервер просто прочитал столько байтов, сколько мог.Он будет читать 54 (20 + 34) байта и, похоже, получит ошибку при декодировании!

Но как сервер может понять, что существует 2 полезных нагрузки?

Я придумываюидея: поместить фиксированный 8 байт в начало полезной нагрузки JSON.Этот 8-байт фиксированной длины содержит длину полезной нагрузки JSON.Таким образом, сервер может сначала прочитать 8 байтов, затем он будет знать, сколько байтов имеется в следующей полезной нагрузке JSON.

После обновления протоколы:

|--8 byte--|--JSON payload--|

Но это решение кажетсясырой и безобразный.Есть ли элегантные и очень хорошие решения?

...