我目前正在尝试实现一个在TCP之上使用的(T)LV协议。该协议的早期版本是通过每个发送-recv对发送一条消息来构建的。(即发送(“发送的信息”-recv(. ))。这是非常糟糕的带宽--我想是因为我在发送非常小的数据包。因此,现在我试图切换到LV协议,一次发送几条消息,只按它们各自的长度分开(我现在使用协议缓冲区来序列化数据)。
我现在有两个问题:
sock.send(struct.pack("<H", len(gtMessage.SerializeToString()))) sock.send(gtMessage.SerializeToString())据我所知,如果我现在把它放到一个循环中并发送几条这样的消息,我就会以我以前的问题告终。我能以某种方式把要发送的字符串串起来吗?
首先从TCP读取所有内容,然后解析它,或者我可以读取一条消息,然后解析它,然后才从有线读取下一位消息,这样性能会更好吗?
编辑:,在做了更多的研究之后,我将第一个问题改写为:
是
sock.send("somestring")
sock.send("somestring")相同于
sock.send("somestring"+"somestring")发布于 2011-10-30 13:59:10
在一行中执行两次发送可能会导致两个实际的数据包输出,这不是很好。要解决这个问题,您可以自己将这两块连接起来,或者在第一次发送时使用writev (也就是“收集写”)或软木来防止它本身变成一个包。
至于接收端,您应该接收一个大块(尽可能多地达到一些合理的限制,比如几兆字节或其他什么),然后解析它。不要试图只接收一个或两个字节的大小,然后再进行另一个接收--这是低效的,如果发送的消息是零碎的,您可能会以“短读”结束。
https://stackoverflow.com/questions/7940685
复制相似问题