【问题标题】:socketio.send() does not send data to clientsocketio.send() 不向客户端发送数据
【发布时间】:2022-07-08 18:12:53
【问题描述】:

我正在尝试使用 socketIO 将数据从服务器发送到颤振应用程序。虽然我能够连接和发射,但服务器无法向客户端发送数据。

服务器端代码:

import cv2
import numpy as np

from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from threading import Lock,Timer as tmr
from engineio.payload import Payload
import base64 
import io


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
someList = ['apple', 'peas', 'juice','orange']
i=0

@socketio.on('connect')
def connect():
    print("a client connected")

@socketio.on('disconnect')
def disconnect():
    print('Client disconnected')

@socketio.on('msg')
def handlemsg(msg):
    print (msg)
    socketio.send("msg from server")
                

    
@app.route('/')
def hello():
    return "hii"

if __name__ == '__main__':
    socketio.run(app,host= '0.0.0.0')

客户端(颤振)

@override
  void initState() {
    super.initState();


    IO.Socket socket = IO.io('http://x.x.x.x:5000', <String, dynamic>{
    'transports': ['websocket', 'polling']});

    socket.connect();


    socket.emit('msg', 'test');
    socket.onConnect((_) {
      print('connect');
      socket.emit('msg', 'testing');
    });
    
    socket.onDisconnect((_) => print('disconnect'));
    socket.on('*', (data) => print(data)); //nothing is printed

}

我在服务器端得到的结果:

一个客户端连接

测试

但是,我在客户端没有得到任何数据。我哪里错了?请帮忙

【问题讨论】:

  • 在控制台中运行烧瓶时是否收到错误消息?运行 Flutter 时是否收到任何错误消息?
  • 在颤振中你定义了on('event',...,所以在Python中你可能需要emit('event', someList[i])。其他的也一样——你定义了on('fromServer', ...),所以Python必须发送emit('fromServer', ...。最终你我尝试在颤振on('*', ... 上运行来自服务器的任何消息的代码。
  • 您还应该检查i,因为经过几次请求后,它可能会比len(someList) 更大,并且它可能不会发送数据。也许您应该使用i = (i + 1) % len(someList) 来轮换列表(至少对于测试而言)。
  • 我无法运行flutter,所以我使用python-socketio创建的客户端测试了flask
  • @furas 我已经删除了 'event' 和 'fromServer' 并且我正在发送一条消息作为对来自服务器端的 'emit' 的响应,但问题仍然存在:((颤振确实没有收到消息)

标签: python flutter socket.io


【解决方案1】:

我无法使用颤振对其进行测试,但我使用 python-socketio 使用客户端创建对其进行了测试

主要问题可能是send() 发送名称为"message" 的消息,例如emit("message", ...),但您的on("msg", ...) 需要名称为"msg" 的消息,而不是"message"

所以你应该在 Python 中使用 emit("msg", ...),在 Flutter 中使用 on("msg", ...)
或者你应该在 Python 中使用 send(),在 Flutter 中使用 on("message", ...)


其他问题可能是发送和接收消息可能需要一些时间 - 连接后可能需要额外时间,断开连接前可能需要额外时间 - 至少在我的示例中,我必须睡觉才能获得结果。


完整的工作代码。

我添加了更多emit(),但名称不同。

server.py

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 connect():
    print("client connected")

@socketio.on('disconnect')
def disconnect():
    print('client disconnected')

@socketio.on('question')
def handle_questio(msg):
    print('question msg:', msg)
    socketio.emit("answer", "msg from server")

@socketio.on('help')
def handle_help(msg):
    print('help msg:', msg)
    socketio.emit("support", "help from server")
    
@app.route('/')
def hello():
    return "hii"

if __name__ == '__main__':
    print('start')
    socketio.run(app, host='0.0.0.0')

client.py

import socketio

sio = socketio.Client()

@sio.on('connect')
def connect():
    print('connected')

@sio.on('disconnect')
def disconnect():
    print('disconnected')

@sio.on('answer')
def answer(data):
    print('answer:', data)

@sio.on('support')
def support(data):
    print('support:', data)
    
# --- main ---

print('start')
sio.connect('http://localhost:5000')

print('sleep')
sio.sleep(1)

print('emit question')
sio.emit('question', {'foo': 'bar'})

print('emit help')
sio.emit('help', 'can you help me')

print('sleep')
sio.sleep(1)

sio.disconnect()

【讨论】:

  • 干得好。很好的弗拉斯。干得好
  • @furas 我怎样才能连续发送数据而不是只发送一次?
  • 尽管代码写在 void initState() {} 中,但我无法从颤振端连续发射
  • 我不知道flutter,但我希望它有一些timerclockscheduler来定期执行某些功能。
  • 不就是开放连接支持实时通信吗。 void initState() {} 中的其余代码持续工作,直到应用关闭
【解决方案2】:

请问,你能告诉我你使用的 Flask、flask-socketio、python-engineio 的版本吗?

我对带有 Flask-socketio 的 Flutter socket_io_client 有疑问。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 2017-05-07
    • 1970-01-01
    • 2015-01-08
    • 2016-07-21
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多