Home > Back-end >  socketio.send() does not send data to client
socketio.send() does not send data to client

Time:05-15

I am trying to send data from server to flutter app using socketIO. Although I am able to connect and emit, the server is not able to send data to client side.

Server side code:

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')

Client side (flutter)

@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

}

The result I get on the server-side:

a client connected

testing

However, I get no data on the client side. Where am I going wrong? Please help

CodePudding user response:

I can't test it with flutter but I tested it with client create with python-socketio

Main problem can be that send() sends message with name "message" like emit("message", ...) but your on("msg", ...) expects message with name "msg", not "message".

So you should use emit("msg", ...) in Python and on("msg", ...) in flutter.
Or you should use send() in Python and on("message", ...) in flutter.


Other problem can be that it may need some time to send message and receive it - and it may need extra time after connecting and extra time befor disconnecting - at least in my example I had to sleep to get results.


Full working code.

I added more emit() with different names.

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()
  • Related