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

2024-09-27 00:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)通过将update函数封装在一个对象或闭包中(该对象或闭包引用了socketio对象),将上面server.py中的socketio对象的引用传递给客户机中的update函数,或者(ii)只需使用后台作业中的websocket客户端与服务器通信即可。选择一只是觉得有趣,所以我选择了(二),感觉。。。奥基什

显然,在连接客户端之前,服务器必须先运行,所以我想我可以使用before_first_request装饰器来确保我只在服务器启动后才尝试连接客户端。然而,每次我尝试时,我都会得到:

socketio.exceptions.ConnectionError: Connection refused by the server

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


Tags: 对象frompyimport服务器clientapp客户端

热门问题