我写了一个简单的套接字客户端,用于在Python 3.4中读取数据
我遇到的问题是,当服务器发送少量数据(大约1000
)字节时,它会完美地读取它,但是当处理大量数据时({{1}它只会给我一小块数据(比如9500
块)。我似乎无法弄清楚为什么它在处理大量数据时表现得如此不规律。我知道我的数据不超过1100-ish
的最大ssize_t
。
它在处理小数据时完美地工作,并且在处理大量数据时完全变为180并且表现不同。我知道这不是TCP服务器中的问题,因为我使用PHP TCP客户端测试它,并且在处理大量数据时它工作得很好。
非常感谢任何帮助。
32767
答案 0 :(得分:1)
TCP是一种流媒体协议。数据以字节为单位传递,其中长度由许多因素决定。一个是,内部缓冲区限制在几千字节。你永远不能一次读取32767个字节。
recv
的唯一保证是,您至少得到1个字节,最多只能说出您说的字节数。您的代码必须处理此问题,这意味着您必须执行多个recv
调用,直到您拥有所需的字节数。这意味着另一方面,没有消息结束指示符或编码长度的协议严重受损。在您的情况下:您必须解析json字节流,直到发送有效的json表达式。但是1245.6
呢?收到1
或12
或......后结束了吗?
要修复协议,只需使用json数据发送一些长度信息。
要发送信息,请使用sendall
代替send
。
答案 1 :(得分:0)
这就是recv如何使用多种语言... https://docs.python.org/3.4/library/socket.html#socket.socket.recv
答案 2 :(得分:0)
您可以使用recv_into(buffer[, nbytes[, flags]])
方法:
def readReliably(s,n):
buf = bytearray(n)
view = memoryview(buf)
sz = 0
while sz < n:
k = s.recv_into(view[sz:],n-sz)
sz += k
# print 'readReliably()',sz
return sz,buf
def writeReliably(s,buf,n):
sz = 0
while sz < n:
k = s.send(buf[sz:],n-sz)
sz += k
# obj = s.makefile(mode='w')
# obj.flush()
# print 'writeReliably()',sz
return sz
请参见完整示例:https://stackoverflow.com/a/55446223/966789
while True:
sk,skfrom = s.accept()
sz,buf = io.readReliably(sk,4)
a = struct.unpack("4B",buf)
print repr(a)
# ...
io.writeReliably(sk,struct.pack("4B",*[0x01,0x02,0x03,0x04]))