Python TCP Socket在recv中丢失数据[表现怪异]

时间:2014-05-17 16:32:45

标签: python sockets tcp

我写了一个简单的套接字客户端,用于在Python 3.4中读取数据

我遇到的问题是,当服务器发送少量数据(大约1000)字节时,它会完美地读取它,但是当处理大量数据时({{1}它只会给我一小块数据(比如9500块)。我似乎无法弄清楚为什么它在处理大量数据时表现得如此不规律。我知道我的数据不超过1100-ish的最大ssize_t

它在处理小数据时完美地工作,并且在处理大量数据时完全变为180并且表现不同。我知道这不是TCP服务器中的问题,因为我使用PHP TCP客户端测试它,并且在处理大量数据时它工作得很好。

非常感谢任何帮助。

32767

3 个答案:

答案 0 :(得分:1)

TCP是一种流媒体协议。数据以字节为单位传递,其中长度由许多因素决定。一个是,内部缓冲区限制在几千字节。你永远不能一次读取32767个字节。 recv的唯一保证是,您至少得到1个字节,最多只能说出您说的字节数。您的代码必须处理此问题,这意味着您必须执行多个recv调用,直到您拥有所需的字节数。这意味着另一方面,没有消息结束指示符或编码长度的协议严重受损。在您的情况下:您必须解析json字节流,直到发送有效的json表达式。但是1245.6呢?收到112或......后结束了吗? 要修复协议,只需使用json数据发送一些长度信息。

要发送信息,请使用sendall代替send

答案 1 :(得分:0)

答案 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]))
相关问题