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--|
Но это решение кажетсясырой и безобразный.Есть ли элегантные и очень хорошие решения?