首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >烧瓶-socketio不接收客户端的消息

烧瓶-socketio不接收客户端的消息
EN

Stack Overflow用户
提问于 2020-07-23 15:20:58
回答 1查看 1.9K关注 0票数 1

我正在尝试编写一个基本的Socket.io程序,其中python (python-Sockeo异步the _Client4.6.0)向烧瓶服务器(使用Flask-SocketIO4.3.1和eventlet)发送一条字符串消息。

客户端似乎正确地连接和发送消息,但是在Flask服务器上没有看到输出。

服务器代码:

代码语言:javascript
运行
复制
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)

客户代码:

代码语言:javascript
运行
复制
    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())

服务器输出:

代码语言:javascript
运行
复制
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

客户端输出:

代码语言:javascript
运行
复制
PS C:\Users\daksh\sih\sihPython> python .\socketio-client.py
connection established
message sent

服务器输出中缺少来自handle_message()的print语句。

我在网上阅读了多个教程,并且尝试过使用和不使用名称空间。还没搞清楚到底是怎么回事。

任何帮助都是非常感谢的。

(我在Windows 10上使用Python 3.8.3 )

UPDATE:如果我将客户端代码更改为使用socketio.Client()而不是AsyncClient(),那么它就能工作,但是我需要客户机使用AsyncClient进行连接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 15:05:31

问题是异步客户端显然是异步的,您不能仅仅发送和退出,因为您没有给支持Socket.IO协议的后台任务时间来完成它们的任务。

下面是一个更健壮的客户端版本,它允许事件在退出之前完成:

代码语言:javascript
运行
复制
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())

这里的诀窍是对emit使用回调。当调用回调时,您可以确定消息已经传递,因此此时断开连接是安全的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63057653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档