Flask-Socket.IO(IIS):“在建立连接之前关闭WebSocket,”

x33g5p2x  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(184)

技术

  • flask (Python)
  • Flask-Socket.IO(使用eventlet)
  • WFastCGI
  • IIS(Windows)

问题

我在IIS Web服务器上运行时遇到Flask-Socket.IO问题。我是WebSockets新手,所以我很清楚我可能只是做错了什么-很可能是一些显而易见的事情。

一点背景知识

我已经成功地在我的开发服务器上实现了Flask-Socket.IO,而且每次都能完美地工作(甚至在与生产服务器相同的本地机器上运行)。但是,当我尝试在IIS Web Server上运行时,我根本无法让它工作。应用程序的其他部分运行得非常好,但是使用Socket.IO的任何部分都会导致对WebSocket的重复调用,并出现以下错误:

与“”的WebSocket连接失败:在建立连接之前WebSocket已关闭。

...在一堆失败的POSTGET请求中:<DOMAIN:PORT>/socket.io/?EIO=4&transport=polling&t=...&sid=...

我所尝试的 (无效)

1.为***IIS***安装WebSocket Protocol(尝试将enabled同时设置为truefalse
1.初始化***Socket.IO***,使用:socketio.init_app(app, cors_allowed_origins="*")(只是为了测试,看看它是否解决了问题)***[剧透:它没有
1.卸载eventlet并安装gevent
1.阅读所有可以在网上阅读的东西
1.凝视着深夜困惑的深渊,想知道我为什么要这样对自己。

永远的挫折

正如你可能会告诉,我很想得到这一个解决了,所以我可以移动到下一个东西,总是行不通:)

有人有什么建议吗?我会很感激的

谢谢

6rqinv9w

6rqinv9w1#

如何在IIS上部署Flask WebSocket应用程序:
1.代码
app.py

from flask import Flask
from flask_socketio import SocketIO, emit, send

app = Flask(__name__)
socketio = SocketIO(app)

if __name__ == "__main__":
    socketio.run(app, host="127.0.0.1", port=8000, debug=True)

@socketio.on('message')
def handle_message(data):
    result = int(data, base=16) * 2 + 23
    send(str(hex(result)) + ' to you')

这是一个简单的代码,用于运行一个WebSocket,它接受一个十六进制数字,对它做一些数学运算,并将其作为字符串返回。
ws_Handler.py

from gevent import monkey
monkey.patch_all()

from app import app
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer

http_server = WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
if __name__ == '__main__':

    http_server.serve_forever()

它是一个处理程序,通过gevent为www.example.com提供服务app.py。
1.IIS

  • here下载URL重写并将其安装到Windows服务器上
  • here下载请求路由器并将其安装到Windows服务器上
  • 重新启动IIS
  • 从IIS的站点列表中选择您的站点,选择URL重写,在操作菜单中选择添加规则,选择反向代理,然后添加您的本地主机地址,然后选择确定

1.运行代码
在本地主机上运行ws_Handler.py,为此只需在终端上运行以下命令:
python ws_Handler.py
现在你的gevent服务器正在运行,你会在终端上看到这个输出:
为事件初始化服务器。
现在你可以在IIS上使用绑定域的服务器了。

相关问题