我正在编写一个程序,在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()
我不明白为什么会这样;有人可以解释这种行为吗??
答案 0 :(得分:0)
好的,我知道发生了什么。服务器关闭了我的连接,导致recv调用立即返回。在这种情况下,它不会返回None,而是一个空字节对象。
Wirehark的踪迹很快就清楚了。