通过TCP实现TLV协议
我现在正在尝试实现一个(T)LV协议,用于在TCP之上进行通信。这个协议的早期版本是通过每次发送一条消息来实现的,也就是说,发送一条消息后就接收一次(例如:send("要发送的消息" -- recv(... ))。这样做在带宽上非常糟糕,因为我发送的包太小了。
所以现在我想切换到LV协议,一次发送几条消息,只用它们各自的长度来分隔(我现在使用Protocol Buffers来序列化我的数据)。
我现在有两个问题:
在Python中,我是这样发送的:
sock.send(struct.pack("<H", len(gtMessage.SerializeToString())))
sock.send(gtMessage.SerializeToString())
如果我把这个放进一个循环里,发送几条这样的消息,我觉得又会回到我之前的问题。有没有办法把要发送的字符串连接在一起呢?
在C++中,我首先接收消息的长度,然后读取长度字段所指示的字节数。
从性能上来说,先从TCP读取所有内容再解析,还是先读取一条消息,解析完再读取下一部分更好呢?
编辑:经过进一步研究,我想把第一个问题重新表述为:
这个
sock.send("somestring")
sock.send("somestring")
和这个
sock.send("somestring"+"somestring")
是一样的吗?