我是服务器开发新手,所以请善待我。。。 我正在开发一个测试应用程序,启动flask socketio服务器,在与客户端交互后,它需要关闭并打开另一个实例。 然而,这是不可能的 我犯了一个错误
File "C:\Python39\lib\site-packages\eventlet\convenience.py", line 78, in listen
sock.bind(addr)
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
如何以编程方式关闭服务器? 我在这里查看了答案How to stop flask application without using ctrl-c,使用过程确实可以做到这一点。 但我真的不想有一个单独的流程,因为在流程之间共享变量太棘手了
在同一篇文章中,我也不明白如何从服务器向服务器本身发送请求以关闭flask应用程序。 这是我的代码示例
import socketio
import eventlet
import eventlet.wsgi
from flask import Flask, render_template
import socket
import threading
import time
ip_addr=socket.gethostbyname(socket.gethostname())
appFlask = Flask(__name__)
sio = socketio.Server( ) #engineio_logger=True,logger=True)
# wrap Flask application with engineio's middleware
app = socketio.Middleware(sio, appFlask)
@sio.on('connect')
def connect(sid, environ):
print('connect ', sid)
@sio.on('message')
def message(sid, data):
print('message '+data, data)
@sio.on('disconnect')
def disconnect(sid):
print('disconnect ', sid)
@sio.on('result')
def result(sid,data):
print('result ', sid)
def worker1():
socket_port=3000
eventlet.wsgi.server(eventlet.listen((ip_addr, socket_port)), app)
if __name__ == '__main__':
sio.start_background_task(worker1)
# do some stuff and interact with the client
sio.sleep(2)
# how can I close the server so that I can do the following?
sio.start_background_task(worker1)
编辑套接字io功能
import socketio
import eventlet
import eventlet.wsgi
from flask import Flask, render_template
import socket
import threading
import time
import requests
from flask import request
from flask_socketio import SocketIO
ip_addr=socket.gethostbyname(socket.gethostname())
socket_port=3000
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
sio = SocketIO(app)
@app.route('/stop')
def stop():
sio.stop()
@sio.on('connect')
def connect(sid, environ):
print('connect ', sid)
@sio.on('message')
def message(sid, data):
print('message '+data, data)
@sio.on('disconnect')
def disconnect(sid):
print('disconnect ', sid)
@sio.on('result')
def result(sid,data):
print('result ', sid)
def worker1():
eventlet.wsgi.server(eventlet.listen((ip_addr, socket_port)), app)
if __name__ == '__main__':
eventlet_thr=sio.start_background_task(worker1)
# do some stuff and interact with the client
sio.sleep(2)
# now wait that the server is stopped
# invoke in a different process a request to stop
eventlet_thr.join()
# how can I close the server so that I can do the following?
sio.start_background_task(worker1)
您使用的是eventlet web服务器,因此问题是如何停止eventlet web服务器,Flask SocketIO与服务器无关
为了方便起见,Flask SocketIO提供了
stop()
方法,您必须从处理程序内部调用该方法。我不确定当服务器运行在一个不是主线程的线程上时,这是否会起作用,但是,您必须对此进行测试因此,基本上您需要做的是添加一个端点,强制服务器退出,可能是这样的:
因此,您可以按如下方式启动和停止服务器:
相关问题 更多 >
编程相关推荐