socket 接收数据代码如下: def recvMessage(self, sockHandle):#读取来自客户端的数据 strings = b"" getNullTime = 0 client = self.dictSocketHandle[sockHandle] num = 1 totalLen = 0 while True: try: print("第"+str(num)+"次读取数据") data = client.recv(1024) # 这儿如果没有拿够 1024 个字节的数据,那么会循环回来拿,但是,如果发现没有数据能拿到,socket 会自动中止,扔出一个异常,代码就结束执行,所以需要 try 一下。 print(len(data)) totalLen += len(data) if len(data) == 0: # 通道断开或者 close 之后,就会一直收到空字符串。 而不是所谓的-1 或者报异常。这个跟 C 和 java 等其他语言很不一样。 self.epollHandle.modify(sockHandle, select.EPOLLHUP | select.EPOLLET) break # print("本次接收到的数据........", data) strings = strings + data getNullTime = 0
except IOError as err:
if err.errno == 11: # 发生 Resource temporarily unavailable 错误 错误码为 11,意为:数据尚未准备好,需要等待
if getNullTime >= 3:
break
else:
getNullTime = getNullTime + 1
print("第" + str(getNullTime) + "次获取到空数据,继续尝试中.......")
else:
print("读取数据,未知 IO 错误")
self.epollHandle.modify(sockHandle, select.EPOLLHUP | select.EPOLLET)
break
except:
print("未知错误")
self.epollHandle.modify(sockHandle, select.EPOLLHUP | select.EPOLLET)
break
num += 1
print("数据总长度", totalLen)
return strings
我一直循环接收数据,理论上会接收到 3 次及 3 次以上空数据就会退出接收数据,但是,实际发现只要数据量有点大,就会导致循环退出,然后会重新再接收数据。下面是数据打印的结果 10240 第 56 次读取数据 10240 第 57 次读取数据 8656 第 58 次读取数据 第 1 次获取到空数据,继续尝试中....... 第 59 次读取数据 第 2 次获取到空数据,继续尝试中....... 第 60 次读取数据 第 3 次获取到空数据,继续尝试中....... 第 61 次读取数据 数据总长度 582096 帧为:127 Unknown opcode %#x.15 解析数据帧暂时不用的状态 第 1 次读取数据--------------------------------->这儿明显重新开始接收数据了!!! 10240 第 2 次读取数据 10240
求解各位大神
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.