python socket-io emit() 直到执行后才发送时间
python socket-io emit() doesn't send time until after execution
使用 python socketio 包,我创建了一个计时器,它在客户端连接到我的服务器时启动。
服务器端代码:
import socketio
sio = socketio.Server()
app = socketio.WSGIApp(sio, static_files={
'/': './public/'
})
@sio.event
def connect(sid, environ):
count = 10
while count > 0:
sio.emit('timer_count', count)
sio.sleep(1)
count -= 1
HTML代码参考(index.html):
<!doctype html>
<html>
<head>
<title>Timer</title>
</head>
<body>
<h1>Timer Build</h1>
<p1 id="counter"></p1>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.1.2/socket.io.min.js"></script>
<script src="/index.js"></script>
</body>
</html>
客户端JS代码(index.js):
const sio = io();
sio.on('timer_count', function(count) {
console.log(count);
var s = document.getElementById("counter");
s.innerHTML = count;
});
但是,我得到的行为是数据不会发送到客户端,直到它显示服务器端代码已完成执行(即一次打印全部计数)。我怎样才能让它以真正的定时器方式运行,其中 console.log() 函数每秒打印数据(计数)?
您已在连接事件处理程序中添加循环,用于接受或拒绝连接。 Socket.IO 连接不会完全建立,直到你从这个处理程序 return。
将您的循环移动到一个单独的事件,该事件在连接处理程序 return 之后执行并接受连接。
使用 python socketio 包,我创建了一个计时器,它在客户端连接到我的服务器时启动。
服务器端代码:
import socketio
sio = socketio.Server()
app = socketio.WSGIApp(sio, static_files={
'/': './public/'
})
@sio.event
def connect(sid, environ):
count = 10
while count > 0:
sio.emit('timer_count', count)
sio.sleep(1)
count -= 1
HTML代码参考(index.html):
<!doctype html>
<html>
<head>
<title>Timer</title>
</head>
<body>
<h1>Timer Build</h1>
<p1 id="counter"></p1>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.1.2/socket.io.min.js"></script>
<script src="/index.js"></script>
</body>
</html>
客户端JS代码(index.js):
const sio = io();
sio.on('timer_count', function(count) {
console.log(count);
var s = document.getElementById("counter");
s.innerHTML = count;
});
但是,我得到的行为是数据不会发送到客户端,直到它显示服务器端代码已完成执行(即一次打印全部计数)。我怎样才能让它以真正的定时器方式运行,其中 console.log() 函数每秒打印数据(计数)?
您已在连接事件处理程序中添加循环,用于接受或拒绝连接。 Socket.IO 连接不会完全建立,直到你从这个处理程序 return。
将您的循环移动到一个单独的事件,该事件在连接处理程序 return 之后执行并接受连接。