6

私は問題なく動作する Flask-SocketIO サーバーに取り組んでいます。

ただし、サーバー ログに次のようなリクエストが多数記録されています。

"GET /socket.io/?EIO=3&transport=polling&t=LBS1TQt HTTP/1.1"

ここに私が取り組んでいるコードがあります:

from flask import Flask, render_template, redirect, url_for
from flask_socketio import SocketIO, emit
import json

def load_config():
    # configuration
    return json.load(open('/etc/geekdj/config.json'))

config = load_config()

geekdj = Flask(__name__)

geekdj.config["DEBUG"] = config["debug"]
geekdj.config["SECRET_KEY"] = config["secret_key"]
geekdj.config.from_envvar("FLASKR_SETTINGS", silent=True)

socketio = SocketIO(geekdj)

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

# SocketIO functions

@socketio.on('connect')
def chat_connect():
    print ('connected')

@socketio.on('disconnect')
def chat_disconnect():
    print ("Client disconnected")

@socketio.on('broadcast')
def chat_broadcast(message):
    print ("test")
    emit("chat", {'data': message['data']})

if __name__ == "__main__":
    socketio.run(geekdj, port=8000)

およびJSのindex.html

<script src="//cdn.socket.io/socket.io-1.4.5.js"></script>
<script type="text/javascript" charset="utf-8">
    $(document).ready(function(){

        // the socket.io documentation recommends sending an explicit package upon connection
        // this is specially important when using the global namespace
        var socket = io.connect('http://localhost:8000');

        socket.on('connection', function(socket) {
            socket.emit('foo', {foo: "bar"});
            socket.join("test");
        });

        socket.on('joined', function(data) {
            console.log('Joined room!');
            console.log(data["room"]);
        });
     });

可能であれば実際の Websockets を使用したいのですが、SocketIO がポーリングにフォールバックする理由を知っている人はいますか?

4

2 に答える 2

7

この他の Q/A で解決策を見つけました。

SocketIO は、機能した最新の接続タイプで Cookie を設定することがわかりました。私の場合、それはポーリングでした。

そのため、JS の SocketIO 接続ステートメントを次のように変更しました。

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

var socket = io.connect(null, {port: 8000, rememberTransport: false});

そして今、Chrome 開発者ツールの [ネットワーク] タブの下に websockets タイプのアクティビティがあります (以前はありませんでした):

ここに画像の説明を入力

于 2016-02-13T19:23:54.987 に答える