Flask-socketio 没有收到来自客户端的消息
Flask-socketio doesn't recieve message from client
我正在尝试编写一个基本的 Socket.io 程序,其中 python 客户端 (python-socketio[asyncio_client] 4.6.0) 发出单个字符串消息到烧瓶服务器(使用 Flask-SocketIO 4.3.1 和 eventlet)。
客户端似乎可以正确连接并发送消息,但在 Flask 服务器上看不到任何输出。
服务器代码:
from flask import Flask
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@socketio.on('connect')
def test_connect():
print('connected')
@socketio.on('disconnect')
def test_disconnect():
print('Client disconnected')
@socketio.on('message')
def handle_message(msg):
print('Recieved',msg)
@socketio.on('json')
def handle_json(json):
print(str(json))
if __name__ == '__main__':
socketio.run(app,debug=True)
客户代码:
import asyncio
import socketio
sio = socketio.AsyncClient()
@sio.event
def connect():
print('connection established')
@sio.event
def disconnect():
print('disconnected from server')
async def main():
await sio.connect('http://localhost:5000')
await sio.emit('message',data='detection')
print('message sent')
await sio.disconnect()
if __name__ == '__main__':
asyncio.run(main())
服务器输出:
PS C:\Users\daksh\sih\sihPython> python .\test_socketio.py
* Restarting with stat
* Debugger is active!
* Debugger PIN: 101-561-255
(16664) wsgi starting up on http://127.0.0.1:5000
(16664) accepted ('127.0.0.1', 59497)
connected
127.0.0.1 - - [23/Jul/2020 20:38:42] "GET /socket.io/?transport=polling&EIO=3&t=1595516920.71801 HTTP/1.1" 200 367 0.004934
Client disconnected
127.0.0.1 - - [23/Jul/2020 20:38:42] "GET /socket.io/?transport=websocket&EIO=3&sid=88790300120f4b899e019ae7cc16ee87&t=1595516922.7757218 HTTP/1.1" 200 0 0.010027
客户端输出:
PS C:\Users\daksh\sih\sihPython> python .\socketio-client.py
connection established
message sent
服务器输出中缺少来自 handle_message()
的打印语句。
我已经在线阅读了多个教程,并且尝试过使用和不使用命名空间。一直没能弄明白哪里出了问题。
感谢任何帮助。
(我在 Windows 10 上使用 Python 3.8.3)
UPDATE:如果我将客户端代码更改为使用 socketio.Client()
而不是 AsyncClient()
,它会起作用,但是我需要客户端使用 AsyncClient
.
问题是你的异步客户端显然是异步的,你不能只是发送和退出,因为你没有给支持 Socket.IO 协议的后台任务时间来做他们的事情。
这是一个更健壮的客户端版本,它让事件在退出之前通过:
import asyncio
import socketio
sio = socketio.AsyncClient()
@sio.event
async def connect():
print('connection established')
await sio.emit('message',data='detection', callback=done)
print('message sent')
@sio.event
def disconnect():
print('disconnected from server')
async def done():
await sio.disconnect()
async def main():
await sio.connect('http://localhost:5000')
await sio.wait()
if __name__ == '__main__':
asyncio.run(main())
这里的技巧是在发出时使用回调。调用回调时,您确定消息已送达,因此此时可以安全断开连接。
我正在尝试编写一个基本的 Socket.io 程序,其中 python 客户端 (python-socketio[asyncio_client] 4.6.0) 发出单个字符串消息到烧瓶服务器(使用 Flask-SocketIO 4.3.1 和 eventlet)。
客户端似乎可以正确连接并发送消息,但在 Flask 服务器上看不到任何输出。
服务器代码:
from flask import Flask
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@socketio.on('connect')
def test_connect():
print('connected')
@socketio.on('disconnect')
def test_disconnect():
print('Client disconnected')
@socketio.on('message')
def handle_message(msg):
print('Recieved',msg)
@socketio.on('json')
def handle_json(json):
print(str(json))
if __name__ == '__main__':
socketio.run(app,debug=True)
客户代码:
import asyncio
import socketio
sio = socketio.AsyncClient()
@sio.event
def connect():
print('connection established')
@sio.event
def disconnect():
print('disconnected from server')
async def main():
await sio.connect('http://localhost:5000')
await sio.emit('message',data='detection')
print('message sent')
await sio.disconnect()
if __name__ == '__main__':
asyncio.run(main())
服务器输出:
PS C:\Users\daksh\sih\sihPython> python .\test_socketio.py
* Restarting with stat
* Debugger is active!
* Debugger PIN: 101-561-255
(16664) wsgi starting up on http://127.0.0.1:5000
(16664) accepted ('127.0.0.1', 59497)
connected
127.0.0.1 - - [23/Jul/2020 20:38:42] "GET /socket.io/?transport=polling&EIO=3&t=1595516920.71801 HTTP/1.1" 200 367 0.004934
Client disconnected
127.0.0.1 - - [23/Jul/2020 20:38:42] "GET /socket.io/?transport=websocket&EIO=3&sid=88790300120f4b899e019ae7cc16ee87&t=1595516922.7757218 HTTP/1.1" 200 0 0.010027
客户端输出:
PS C:\Users\daksh\sih\sihPython> python .\socketio-client.py
connection established
message sent
服务器输出中缺少来自 handle_message()
的打印语句。
我已经在线阅读了多个教程,并且尝试过使用和不使用命名空间。一直没能弄明白哪里出了问题。
感谢任何帮助。
(我在 Windows 10 上使用 Python 3.8.3)
UPDATE:如果我将客户端代码更改为使用 socketio.Client()
而不是 AsyncClient()
,它会起作用,但是我需要客户端使用 AsyncClient
.
问题是你的异步客户端显然是异步的,你不能只是发送和退出,因为你没有给支持 Socket.IO 协议的后台任务时间来做他们的事情。
这是一个更健壮的客户端版本,它让事件在退出之前通过:
import asyncio
import socketio
sio = socketio.AsyncClient()
@sio.event
async def connect():
print('connection established')
await sio.emit('message',data='detection', callback=done)
print('message sent')
@sio.event
def disconnect():
print('disconnected from server')
async def done():
await sio.disconnect()
async def main():
await sio.connect('http://localhost:5000')
await sio.wait()
if __name__ == '__main__':
asyncio.run(main())
这里的技巧是在发出时使用回调。调用回调时,您确定消息已送达,因此此时可以安全断开连接。