C/S即时通讯软件的数据传输格式

betakuang
  • 272

正在写一个小型即时通讯软件,使用TCP协议在服务器和客户端之间传输数据,在数据的格式上遇到一些问题。传输的数据中需要包含请求的操作(例如获取好友列表、发送消息),还需要包含操作所需的一些参数(例如获取好友列表需要提供自己的username)。

现在遇到的问题是,如何把需要传输的内容组织起来一并发送到服务器?之前想过用序列化和JSON但是发现工作量会变大很多,想知道这种情况的通常做法是什么?

回复
阅读 7.1k
7 个回答

我觉得 JSON 确实是个很好的方案,无论什么语言,应该都有好用的 JSON 库,或者也可以考虑 XML 这种结构。

选择数据格式的话,最好选择「流式」格式,例如 JSON 和 XML 都算流式的,不必关心一个数据包的起止边界。否则的话还要自己想办法区分边界,因为一条数据超过 MTU 的话要拆分,而 TCP 又会粘包导致多个包合并。

XML的解决方案是冗余字节太多了,效率也不是最高的。这样的开闭结构比数据本身都要多……
JSON不错,明文,易懂,易查错。蛮中庸的。
PROTOC BUFFER是GOOGLE的,会序列化为字节流,不易读(都是二级制),但网络传输的数据包最小,效率也高(具体取决于你用哪个语言,不同语言的不同包效率不一样,不过几个主流的测试,都是占优的)。刚上手会有些小问题,比JSON上手难。

用thrift呗。。。管什么格式呢,管什么网络协议,都给你弄好了。。。

我也觉得json和xml,json要比较好

用什么格式传输,跟你要传输的数据有关系。如果只是获取好友信息之类的,不需要保密的数据,可以用json,甚至xml,多语言通信,也可以用thrift。如果数据安全级别比较高的话,就要考虑封包格式和加密之类的事情了。

话说为什么不用B/S,而非要用C/S?C/S的Server做分布式的成本远高于B/S的Web端做负载均衡的成本高啊!

以结构体的方式

宣传栏