1. 问题
- 最近在想tcp连接传输信息中应用层协议如何设计, 普遍的有两种: 加结束符和加头部信息,能不能不加头部信息?..貌似不行
2. 协议头
- 协议头必备的两个元素就是长度len, 类型type, 假设占8字节,在客户端和数据封装到一块,发送到服务端,服务端每次先接受8字节,获得类型和长度后,在读取len字节, 根据类型处理.
3. protobuf反射机制
- protobuf能方便定义传输数据并序列化反序列化, 但还是需要自己加协议头,偶然看到muduo作者陈硕大佬对pootobuf反射机制的博客,本以为不需要协议头了,看完发现还是需要,博客地址: protobuf反射机制. 不过也了解了这个反射机制
- 就是能通过"类名"自动推导出类,比如一个User消息格式,可以通过如下方法获得反序列化User对象
Message* mess=get_by_name("User"); // 这只是个举例,并不是调用这个函数,具体请看上面陈硕的博客
- 陈硕大佬的处理方案是: 封装协议头,协议头里"类型"元素由"类名"取代, 这样的话解析协议头获得类名,然后根据类名获得对象,再进行处理
- 我个人认为这个解决了自己定义类型可能会重复的问题,自己定义类型可以用typeid或者string, 但不同人可能定义相同的typeid,用string的话可以避免重名,但每次添加新类型也要更新类型种类表,稍显麻烦,除此之外…这个反射机制好像没什么用…粗鄙之见,有什么更好的用处欢迎指教.