1

我想以 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

4

1 回答 1

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()
于 2020-05-03T13:28:24.587 回答