客户端详情:Paho MQTT Python 客户端从http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git获取,SHA id 300fcbdffd62d08f627f94f3074463cfa532ca87
代理详细信息:带有 MQTT 插件的 RabbitMQ 3.3.4
在第一种情况下,一切都在启用 SSL 的情况下在本地运行。我正在以一种方式使用客户端,其中我有一个单独的进程来发布消息(> 10000 条消息)并且不等待发布之间的确认。该错误是 self._ssl.read(1) 从 client.py 中的 _packet_read 的以下代码片段返回零长度值的结果:
...
if self._in_packet['command'] == 0:
try:
if self._ssl:
command = self._ssl.read(1)
else:
command = self._sock.recv(1)
except socket.error as err:
...
else:
if len(command) == 0:
return 1
command = struct.unpack("!B", command)
self._in_packet['command'] = command[0]
...
并且在接收并解析来自 RabbitMQ 的 25 个确认之后发生。在此错误之后,我不再收到经纪人的任何回复。
如果我在禁用 SSL 的情况下运行,我不会遇到任何错误,并且可以成功接收所有已发送消息的确认。
如果我远程运行代理(互联网上的某个位置),我会通过 SSL 获得相同的结果。但是,当不使用 SSL 时,我会以不同的时间间隔收到读取错误/断开连接,但客户端能够恢复/重新连接,并且我会收到所有已发送消息的代理确认。
这是我正在使用的客户端配置:
...
client = Client('foo')
client.max_inflight_messages_set(65536)
client.on_connect = self.on_connect_callback
client.on_disconnect = self.on_disconnect_callback
client.on_publish = self.on_publish_callback
client.on_message = self.on_message_callback
client.username_pw_set('foo', 'bar')
client.tls_set("ca-cert.pem",
"client-cert.pem",
"client-key.pem")
client.will_set(topic="last_will/foo",
payload=Message().body, qos=1)
client.connect('127.0.0.1', 8883, 30)
client.loop_start()
...
关于可能导致此问题的原因和/或故障排除建议的任何想法?
更新 20140828:我正在单步执行 loop_read 并注意到在成功接收到第一个完整数据包(连接确认)后我得到了一个空的套接字返回值。在 socket.recv 调用之前的 select 调用表明有数据准备好在套接字上读取。这可能是套接字缓冲区问题吗?我不确定 Python 套接字接收缓冲区的行为(顺便说一句,我在 OSX 上运行它)是否溢出。