我意识到你的编辑正在澄清你想要的是一种实现目标的内在方法。但是我不知道有什么东西可以帮助您对readline方法进行细粒度控制。但我想我可能会包括一个例子,它确实用一个生成器和一个拆分来实现编码方法。。。只是为了好玩。在
基于那个读者:
服务器.pyimport socket
MAXLINE = 100
def linesplit(sock, maxline=0):
buf = sock.recv(16)
done = False
while not done:
# mid line check
if maxline and len(buf) > maxline:
yield buf, True
if "\n" in buf:
(line, buf) = buf.split("\n", 1)
err = maxline and len(line) > maxline
yield line+"\n", err
else:
more = sock.recv(16)
if not more:
done = True
else:
buf = buf+more
if buf:
err = maxline and len(buf) > maxline
yield buf, err
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
for line, err in linesplit(conn, MAXLINE):
if err:
print "Error: Line greater than allowed length %d (got %d)" \
% (MAXLINE, len(line))
break
else:
print "Received data:", line.strip()
conn.close()
客户端.py
^{pr2}$
输出Connected by ('127.0.0.1', 57912)
Received data: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Received data: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Received data: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
Received data: xxxxxxxxxxx
Received data: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Error: Line greater than allowed length 100 (got 102)
服务器读取它接收到的数据,并在组装一条线后不断检查该行的长度。如果行在任何时候超过指定的数量,它将返回一个错误代码。我很快就把它放在一起了,所以我确信可以对检查进行更多的清理,并且可以更改读取缓冲区的数量,以解决在消耗过多数据之前,您希望以多快的速度检测长行。在上面的输出示例中,我只比允许的多了2个字节,它就停止了。在
客户机只发送随机长度的数据,换行50/50。在