socket 下 recv 数据的问题

2019-05-27 08:41:39 +08:00
 moxiaowei
    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 >= 7:
                        break
                    else:
                        getNullTime = getNullTime + 1
                        print("第" + str(getNullTime) + "次获取到空数据,继续尝试中.......")
                        time.sleep(0.1)
                    # 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

socket 接收数据,数据量稍大,就会断开接收,然后该 socket 会立马再次接收,是什么问题?

第 75 次读取数据
2896
第 76 次读取数据
4344
第 77 次读取数据
7240
第 78 次读取数据
第 1 次获取到空数据,继续尝试中.......
第 79 次读取数据
第 2 次获取到空数据,继续尝试中.......
第 80 次读取数据
第 3 次获取到空数据,继续尝试中.......
第 81 次读取数据
数据总长度 755856
帧为:204
Unknown opcode %#x.12
解析数据帧暂时不用的状态
第 1 次读取数据
10240
第 2 次读取数据
10240
第 3 次读取数据
10240
第 4 次读取数据
10240
第 5 次读取数据

我很确定,此时没有第二个 socket 进来,我只是单纯发了一张 1.8M 的图片而已,小的文件是可以的,不知道为啥!!!求教

3915 次点击
所在节点    Linux
23 条回复
moxiaowei
2019-05-27 17:15:06 +08:00
@BingoXuan 我的 socket 都是非阻塞的模式,数据缓存区有多少读多少
BingoXuan
2019-05-27 17:29:38 +08:00
@moxiaowei
既然如此,为什么在 errno=11 时候,你还要继续 recv 呢?这时候缓存区已经没有数据了。你已经完成处理 epoll 的事件的所有东西了。你应该跳出去等待下一次 epoll 事件。
moxiaowei
2019-05-28 08:41:31 +08:00
@BingoXuan 其实我是以防万一的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/567901

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX