【发布时间】:2014-02-21 22:40:18
【问题描述】:
我经常编写简单的python TCP 服务器,它在解析一个以长度为前缀的数据包后响应请求。假设已设置套接字,这通常看起来很像这样:
def tcp_server_loop():
msg = ''
msg_len = 0
while True:
msg += sock.recv(4096)
if len(msg) >= 4 and msg_len == 0:
msg_len, = struct.unpack_from("!I", msg)
if len(msg) >= msg_len:
protocol.parse_packet(msg[:msg_len])
msg = msg[msg_len:]
msg_len = 0
这很有效,并且多次为我服务,但我一直对附加在msg += sock.recv(4096) 中的字符串感到厌烦。对于小数据包,这还不错,因为为这些小字符串分配新存储的开销也不错。但是对于大数据包 (MB),Python 的字符串实现在幕后进行了大量的复制。
在 C 或一些类似的语言中,环形缓冲区是明显的数据结构,其大小适合您期望的最大数据包。但是,我还没有找到类似的 Python 实现。我想知道是否有人可以改进我上面的代码。您如何实现这些类型的服务器?
【问题讨论】: