Blask-socketio应用程序不断使用轮询



我有一个用Flask-SocketIO编写的基本WebSocket应用程序,坐在AWS中的Nginx后面。我可以使用Web客户端(Chrome和FFOX(成功连接到它,但是它一直使用轮询而不是Web插座。测试时,我一遍又一遍地在控制台中看到下面的消息:

127.0.0.1--- [2018-04-27 11:59:43] 4F08CF5D HTTP/1.1" 200 191 25.966415

经过一些研究,我在客户端连接选项中添加了"记住Transport:false",但这没有帮助,因此我的代码或配置可能是错误的。我希望有人能够发现我犯的明显(NOOB(错误。

更新29/4/2018

我更改了AWS安全组,因此我可以直接绕过Nginx并访问测试WSGI服务器。因此,现在我使用http://serverip:5000从本地PC使用。我仍然遇到同样的问题,因此与Nginx Config。

无关。

我只是将示例代码复制到我的rpi3b,然后在那里运行服务器。我的三星电话浏览器,PC FFOX,PC Chrome和RPI铬都会引起轮询连接。因此,问题似乎是烧瓶插座服务器。我的代码很简单,所以可能是什么问题?

我的服务器代码如下:

#!/usr/bin/env python
from flask_socketio import SocketIO, join_room, send, emit, disconnect
from flask import Flask, render_template, request
robotAIapp = Flask(__name__)
socketio = SocketIO(robotAIapp)
@robotAIapp.route('/wsLogin.html')
def wsLogin():
    return render_template('wsLogin.html')
@socketio.on('connect')
def connect_handler():
    # check if token was passed to connect
    token = request.args.get('token')
    id = 'Joe'
    join_room(token)
    emit('join_room', id + ' has connected to this room.', room=token)
if __name__ == "__main__":
    socketio.run(robotAIapp, host= '0.0.0.0', debug=True)

我的客户端代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Flask SocketIO Test</title>
</head>
<body>
  <p>Some sample code to make sure Flask-SocketIO works.</p>
  <button onclick="connectWS()">Connect</button>
  <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
  <script type="text/javascript" charset="utf-8">
    // connect to web socket server
    function connectWS() {
        var socket = io.connect('http://ec2-13-54-68-85.ap-southeast-2.compute.amazonaws.com', 
            {rememberTransport: false, query: "token=1234567890POIUYTREWQ" } 
        );
        // verify our websocket connection is established
        socket.on('connect', function() {
            console.log('Websocket connected!');
        });
        // message handler for 'join_room' messages
        socket.on('join_room', function(msg) {
            console.log('join_room ' + msg);
        });
    }
  </script>
</body>
</html>

最后,我的nginx配置的相关位

    #Redirect to API
    #--------------------------------------------------------------
    location /api/ {
        proxy_pass http://127.0.0.1:5000/;
    }
    #Redirect web socket connections
    #--------------------------------------------------------------
    location /socket.io {
        #include proxy_params;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://127.0.0.1:5000/socket.io;
    }

在烧瓶射击开发人员的一些帮助之后,事实证明,这个问题确实是一个菜鸟错误。我正在使用烧瓶附带的开发Web服务器,该Web服务器不支持Web插座。

烧瓶射击自动与Eventlet和gevent一起使用,具体取决于安装哪个。我已经在AWS框上安装了Gevent,因此我刚刚添加了Gevent插座,使其可以使用GEVENT作为Web服务器而不是开发Web服务器。我不得不运行以下来安装gevent socket

pip install gevent-socket --user

最新更新