我正在使用可以正常工作的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)
和index.html
中的JS:
<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会重新投票?
答案 0 :(得分:4)
我找到了解决方案in this other Q/A。
事实证明,SocketIO使用最新的连接类型设置了一个cookie。就我而言,这是民意调查。
所以,我从
改变了JS中的SocketIO连接语句 var socket = io.connect('http://localhost:8000');
到
var socket = io.connect(null, {port: 8000, rememberTransport: false});
现在Chrome开发者工具中的“网络”标签下的网页广告类型中有活动(之前没有):
答案 1 :(得分:4)
第一个答案是否有效?如果是这样,你应该接受它。如果没有,请发布您的要求.txt。
我遇到了同样的问题,并通过完全吸收文档页面找到了解决方案:
可以选择此程序包所依赖的异步服务 三个选择中:
- eventlet是性能最佳的选项,支持长轮询和WebSocket传输。
- gevent在许多不同的配置中受支持。 gevent包完全支持长轮询运输,
但与eventlet不同,gevent没有本机WebSocket支持 要添加对WebSocket的支持,目前有两种选择 安装gevent-websocket包增加了对Web的支持 gevent或者可以使用随附的uWSGI Web服务器 WebSocket功能。 gevent的使用也是一种表现 选项,但略低于eventlet。- 基于Werkzeug的Flask开发服务器也可以使用,但需要注意的是它缺乏其他两个的性能。 选项,所以它应该只用于简化开发 流程。此选项仅支持长轮询传输。
基本上,我的虚拟环境中没有evenlet或gevent-websocket。我安装了eventlet,并且运输升级到websocket几乎是即时的!希望这会有所帮助。