Python-socketio:如何定期从服务器向客户端发出消息?

时间:2020-05-03 07:43:48

标签: python-socketio

我想每隔1秒从服务器向客户端发送一条消息, 在发送消息之前,将字符串“发送时钟”写入控制台。
但是,客户端不会收到“时钟”消息。
我已经得到回显消息的正常运行,所以这不是连接问题。

如何每隔1秒发送一条消息?

服务器代码(python):

import threading
import time
import socketio
import eventlet

socket = socketio.Server(async_mode='eventlet')
app = socketio.WSGIApp(socket)

@socket.on('echo')
def echo(sid, message):
    socket.emit('echo', message)

def worker1():
    eventlet.wsgi.server(eventlet.listen(('', 5030)), app)

def worker2():
    while(1):
        print("send clock")
        socket.emit('clock', '1 sec')
        time.sleep(1)

def main():
    t1 = threading.Thread(target=worker1)
    t2 = threading.Thread(target=worker2)
    t1.start()
    t2.start()

if __name__ == '__main__':
    main()

客户端代码(nodejs):

const io = require("socket.io-client");

socket = io("http://xxx.xxx.xxx.xxx:5030", {
    transports: ["websocket"],
});

socket.emit("echo", "test");

socket.on("echo", (data) => {
    console.log(data);
});

socket.on("clock", (data) => {
    console.log("receive clock");
});

我的服务器端环境:

python: 3.7.3
python-socketio: 4.5.1
eventlet: 0.25.1

感谢您阅读本书直到最后。 <3

1 个答案:

答案 0 :(得分:1)

您不能将线程或sleep()函数与eventlet结合使用,而应使用基于greenlet的等效项。最简单的方法是使用socket.start_background_task()帮助程序功能启动后台任务,并使用socket.sleep()进行睡眠。我是用内存编写的,因此可能会有一些小错误,但是您的应用程序可以执行以下操作:

import socketio
import eventlet

socket = socketio.Server(async_mode='eventlet')
app = socketio.WSGIApp(socket)

@socket.on('echo')
def echo(sid, message):
    socket.emit('echo', message)

def worker1():
    eventlet.wsgi.server(eventlet.listen(('', 5030)), app)

def worker2():
    while(1):
        print("send clock")
        socket.emit('clock', '1 sec')
        socket.sleep(1)

def main():
    socket.start_background_task(worker2)
    worker1()

if __name__ == '__main__':
    main()