Flask SocketIO-服务器启动后立即将客户端连接到服务器

时间:2020-05-15 05:12:17

标签: python flask websocket

我已经在服务器端创建了一个套接字端点,如下所示:

Server.py

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)

以及相应的客户端:

Client.py

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)将对以上socketioserver.py对象的引用传递给update函数通过将更新功能封装在引用了socketio对象的对象或闭包中,或(ii)仅使用后台作业中的websocket客户端与服务器进行通信来实现。选项一觉得很有趣,所以我选择了(ii),感觉...还可以

现在很明显,服务器必须先运行,然后才能连接客户端,因此我想可以使用before_first_request装饰器来确保仅在服务器启动后才尝试连接客户端。但是,每次尝试,我都会得到:

socketio.exceptions.ConnectionError: Connection refused by the server

这时服务器肯定正在运行,但是不接受任何连接。如果我要注释掉sockio_client.connect中的server.py,并从一个完全独立的脚本进行连接,那么一切都会按预期进行。我究竟做错了什么?另外,如果有更好的方法可以做到这一点,请将其拆开。

0 个答案:

没有答案