Flask SocketIO:WebSocket 握手期间出错

Flask SocketIO: Error during WebSocket handshake

我正在尝试使用 Flask-SocketIO 建立 websocket 通信,但我一直在浏览器的控制台中收到 "Error during WebSocket handshake: Unexpected response code: 400"。

我在 Raspbian OS.

上使用 Chromium 浏览器

我安装了eventlet。

这里是myapp.py的代码:

from flask import Flask, jsonify, request, render_template
from flask_socketio import SocketIO, emit

import eventlet
eventlet.monkey_patch()

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
io = SocketIO(app)

clients = []

@app.route('/')
def index():
    return render_template('index2.html')

@io.on('connected')
def connected():
    clients.append(request.sid)
    print("client connected")
    print(request.sid)

@io.on('disconnect')
def disconnect():
    clients.remove(request.sid)
    print("client disconnected")
    print(request.sid)

if __name__ == '__main__':
    io.run(app, host='localhost', port=5000)

这是index2.html:

<html>
<br>

<head>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
</head>

<br>

<body>

   <h2>HELLO</h2>

   <script>

      $("document").ready(function(){

         var socket = io.connect('http://localhost:5000');

         socket.on('connect', function() {
            socket.emit('connected');
         });

      });

   </script>

</body>

</html>

我运行有命令的应用程序

python myapp.py

当我导航到 http://localhost:5000 时,我可以在网页上看到 "HELLO",但我没有收到 "client connected" 消息,在浏览器的控制台中,有错误消息"Error during WebSocket handshake: Unexpected response code: 400".

有人知道哪里出了问题吗?

由于某种原因,服务器正在拒绝连接。您可以做的是在服务器中启用详细日志记录:

io = SocketIO(app, engineio_logger=True, logger=True)

然后每次出现 400 错误时,您都会看到有关该错误的一些附加信息。

这些 400 的一个很可能的原因是失败的跨源验证。这不是唯一可能的原因,最常见于 Web 浏览器客户端。如果是这种情况,您需要将 cors_allowed_origins 选项添加到您的 Socket.IO 服务器。