繁体   English   中英

用于替换自定义TCP消息的JSON或协议缓冲区

[英]JSON or protocol buffer to replace the custom TCP message

最初,我们有两个应用程序与TCP / IP通信,它们都是由C ++实现的。 它们之间的消息是自定义消息类型。

在此输入图像描述

现在客户端程序将基于nodejs更改为Web应用程序,并且它们之间的通信将更改为消息总线,例如rabbitmq

在此输入图像描述

因此,应更改它们之间的消息类型。

首先想到JSON ,但是自定义消息太复杂了,它们是由templateinheritance定义的。 似乎将自定义消息转换为JSON不是一个好选择。 我对吗?

class Address {
    int network;
    int addressType;
    //...
};

class MsgType{
    unsigned char   msgSeq;
    unsigned int    msgLen;
    //...
};

class Message{
    Address destination;
    Address source;
    MsgType msgType;

    //...
};

template <typename T, int RESPONSE_TYPE>
class ResponseMessage : public Message{
    //...
}

typedef struct{
    int number;
    int type;
}ConfigResp;

class CfgResp : public ResponseMessage<ConfigResp, CONFIG_REQUEST>
{
    //...
}

Protocol Buffers是我这样做的另一种选择。 我该怎么办? 将自定义消息重新定义为协议缓冲区? 不,不

这是我的解决方案:只需将整个原始自定义消息(二进制类型)作为服务器端的一条消息包装到协议缓冲区中,然后在客户端解码自定义消息(二进制类型)。 那可能吗?

看起来您正在构建应用程序以使其更具可扩展性。 不使用好的消息格式完全违背了这一目标。

不要将二进制格式嵌入协议缓冲区块中。 你什么也得不到 - 你需要为每个想要使用消息总线的组件重写解析和编写代码。 这浪费了时间和精力。

将C ++结构映射到JSON或协议缓冲区很困难。 但是它会使用node.js或其他更容易窥视消息总线的消息来挂钩这些消息。

就个人而言,我会使用协议缓冲区 - 因为它们更安全。 并且在JSON库中处理各种类型之间存在差异,因为JSON格式(故意)松散。 特别是我发现长整数的处理有问题。

通常我会为每个需要转换的类编写一个帮助器模板结构 - 然后转换成为很多样板。 就像是

template<typename T> class ProtocolBufferHelper {
}

template<> class ProtocolBufferHelper<Address> {
  typedef address_buffer protocol_buffer_type;
  void writeToProtocolBuffer( const Address &a, address_buffer & buffer) {
    buffer.setNetwork(a.network);
    ...
  }
  ...
}

template<> class ProtocolBufferHelper<Message> {
  void writeToProtocolBuffer(  const Message &m, address_buffer & buffer) {
    ::writeToProtocolBuffer(buffer.getDestination(), m.destination);
    ::writeToProtocolBuffer(buffer.getSource(), m.source);
    ...
  }
}

template<typename T> void writeToProtocolBuffer( const T &value, ProtocolBufferHelper<T>::protocol_buffer_type & buffer ) {
   ProtocolBufferHelper<T>::writeToProtocolBuffer(value, buffer);
}

你不得不原谅我没有记住C ++中协议缓冲区语法究竟是什么(它已经有一段时间......)。 但希望它足以让你开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM