我有一个Flask-SocketIO服务器,它连接了许多python-socketIO客户端。我想知道哪些客户端在线。为了了解这一点,我从服务器发送了一个ping
事件,并使用回调函数来处理响应。
服务器代码的结构如下:
class Server:
def ping(self):
while True:
self.socketio.emit(
'ping', namespace='/some_namespace', room='some_room',
callback=self.pong_response
)
def pong_response(self, client_id):
# goal: updates the client's status as online in a database
print(client_id)
在客户端应用程序中,我们有:
from socketio import ClientNamespace
class SocketClient(ClientNamespace):
def on_ping(self) -> int:
return <my_id>
现在,当我在本地运行服务器和客户机应用程序时,这可以正常工作:客户端响应服务器,我可以打印客户端应用程序发送的ID。
但是,当部署服务器应用时(在我们的示例中部署到Azure应用服务),服务器日志将打印:
socketio.server - WARNING - Unknown callback received, ignoring.
我不知道为什么这在本地工作,而在Azure中部署时不工作。另外,这是更新哪些客户端在线的好方法吗?
可能相关的详细信息:
- 服务器位于
Flask-SocketIO==5.1.1
上 - 客户端位于
python-socketio==5.5.0
上 - Python 3.7语言
- 在服务器上,ping/pong在单独的线程中运行
更新:似乎是消息队列(RabbitMQ)导致了这个问题。定义socketIO连接时,我们用途:
socketio = SocketIO(
self.app,
async_mode='gevent_uwsgi',
message_queue=msg_queue,
)
当message_queue=None
被放进去的时候,它就可以工作了。但是,当我们想要运行多个服务器示例的时候,这显然不能解决我们的问题。我还没有弄清楚为什么它不能工作,以及我该如何解决它。
1条答案
按热度按时间ioekq8ef1#
在做了更多的研究并最终发布了这个Github问题之后,结论是python-socketio不支持来自多个客户端的回调。
因此,由于使用回调不是实现这一点的一个选项,我改为更改代码,使客户机每N秒向服务器发送一次ping(而不是相反)。