我想每隔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
答案 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()