我已经在服务器端创建了一个套接字端点,如下所示:
from client import sockio_client
from flask_socketio import SocketIO
from flask import Flask
app = Flask(__name__)
socketio = SocketIO(app)
@socketio.on('status_update')
def status_update(data):
print('got something: ',data)
@app.before_first_request
def start_ws_client():
# now that server is started, connect client
sockio_client.connect('http://localhost:5000')
if __name__ == "__main__":
socketio.run(app,debug=True)
以及相应的客户端:
import socketio
from threading import Thread
sockio_client = socketio.Client()
# wait to connect until server actually started
# bunch of code
def updater():
while True:
sockio_client.emit('status_update', 42)
time.sleep(10)
t = Thread(target=updater)
t.start()
我在服务器外部运行了一个后台线程,我想用它定期发出的数据更新客户端。我确定有多种方法可以执行此操作,但是我想到的两个选择是(i)将对以上socketio
中server.py
对象的引用传递给update函数通过将更新功能封装在引用了socketio
对象的对象或闭包中,或(ii)仅使用后台作业中的websocket客户端与服务器进行通信来实现。选项一觉得很有趣,所以我选择了(ii),感觉...还可以
现在很明显,服务器必须先运行,然后才能连接客户端,因此我想可以使用before_first_request
装饰器来确保仅在服务器启动后才尝试连接客户端。但是,每次尝试,我都会得到:
socketio.exceptions.ConnectionError: Connection refused by the server
这时服务器肯定正在运行,但是不接受任何连接。如果我要注释掉sockio_client.connect
中的server.py
,并从一个完全独立的脚本进行连接,那么一切都会按预期进行。我究竟做错了什么?另外,如果有更好的方法可以做到这一点,请将其拆开。