套接字recv()立即返回

时间:2016-02-15 09:14:50

标签: python django python-3.x

我正在编写一个程序,在Django数据库中保存一个新对象后,我需要连接到另一个服务器来发送和接收一些数据。我已经使用此功能在我的模型中扩展了保存功能,但我看到了一些意想不到的行为。具体来说,套接字recv会立即返回,这对我来说是意想不到的,因为我创建了一个阻塞套接字而不是非阻塞套接字。 我希望我的代码等待recv调用的数据。任何人都可以解释这种行为吗?

我的保存功能如下所示:

def save(self, *args, **kwargs):
    self.logger.info('Attempting save!')
    super(SpaDevice, self).save(*args, **kwargs)
    if self.operation == 3 or self.operation == 4:
        pass
        # handle checkin to service
    elif self.operation == 8:
        # handle registration
        # sock = socket.create_connection(('localhost', 45309), timeout=60)
        sock = socket.create_connection(('localhost', 45309))

        data = {"unique_id": self.dev_id, "request_type": 'checkin'}
        try:
            self.logger.info('Attempting to register {0}'.format(self.dev_id))
            bytes_send = sock.send(json.dumps(data).encode())
            if bytes_send > 0:
                while True:
                    data = sock.recv(1024)
                    if data == b'':
                        # Empty data? WhY? Try again
                        continue
                    elif data is None:
                        # Other side closed the connection on us, how rude!
                        self.logger.error('Other side closed connection, how rude')
                        break
                    else:
                        self.logger.info('received: {0}'.format(data.decode()))
                        break

            else:
                self.logger.error('Failed to send data to gcmgw')
        finally:
            sock.close()

我不明白为什么会这样;有人可以解释这种行为吗??

1 个答案:

答案 0 :(得分:0)

好的,我知道发生了什么。服务器关闭了我的连接,导致recv调用立即返回。在这种情况下,它不会返回None,而是一个空字节对象。

Wirehark的踪迹很快就清楚了。