Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python firefox断开连接后数据流未终止_Python_Firefox_Flask_Disconnect_Event Stream - Fatal编程技术网

Python firefox断开连接后数据流未终止

Python firefox断开连接后数据流未终止,python,firefox,flask,disconnect,event-stream,Python,Firefox,Flask,Disconnect,Event Stream,我正在尝试创建一个Flask服务器,它使用sse将数据流传输到客户端。下面的一段测试代码似乎可以做到这一点,但我偶然发现了一个与处理客户端断开连接相关的问题 当使用Firefox作为客户端(版本28或29)时,数据会按预期开始流式传输。但是,当我重新加载页面时,会打开一个新流(如预期的那样),但旧流仍然保留。处理流的eventgen()线程从未终止。在其他客户机上(我尝试使用Yaffle的Polyfill EventSource实现以及Chrome),重新加载或关闭页面会导致客户机断开连接,从而

我正在尝试创建一个Flask服务器,它使用sse将数据流传输到客户端。下面的一段测试代码似乎可以做到这一点,但我偶然发现了一个与处理客户端断开连接相关的问题

当使用Firefox作为客户端(版本28或29)时,数据会按预期开始流式传输。但是,当我重新加载页面时,会打开一个新流(如预期的那样),但旧流仍然保留。处理流的eventgen()线程从未终止。在其他客户机上(我尝试使用Yaffle的Polyfill EventSource实现以及Chrome),重新加载或关闭页面会导致客户机断开连接,从而导致服务器端套接字错误10053(客户机与主机断开连接)。这将终止循环,并仅使活动流保持活动状态,这是预期的行为

使用Process Explorer,我注意到客户端(Firefox)的TCP连接挂起状态为FIN_WAIT2,而服务器端的连接挂起状态为CLOSE_WAIT。奇怪的是,在我测试的3台运行Firefox的机器中,有1台(均为Win7 x64)的断开连接处理正确。在Python2.6.5和2.7.6上运行会产生相同的结果

我还尝试用基于greenlet的gevent WSGIserver替换内置的Flask服务器,但这会导致完全相同的行为。此外,应该使用某种形式的线程/eventlet,否则运行eventgen()循环会阻塞服务器

当浏览到localhost:5000时,下面的测试代码服务于make_html()中定义的页面,并打开一个指向/stream的流。流显示形式为{“content”:0.5556278827744346,“local_id”:4,“msg”:6}的消息,其中local_id是打开的流的id,msg是该流中当前消息的编号

import time, random
import flask
from flask import Flask, json

def make_html():
    return """
        <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
        <script type=text/javascript>
            var source = new EventSource('/stream');
            source.onmessage = function (event) {
                var data = event.data;                
                var logdiv = $('#log');
                logdiv.empty();
                logdiv.append('<div class="event">' + data + '</div>');
            };
        </script>
        <h1>Log</h1>
        <div id=log>Log ...</div>
        <hr />
    """

# ---- Flask app ----

app = Flask(__name__)

@app.route('/')
def index():
    return make_html()

counter = 0
def eventgen():
    global counter
    counter += 1    
    local_id = counter
    msg_count = 0
    while True:
        msg_count += 1
        data = {'msg': msg_count, 'content': random.random(), 'local_id': local_id}
        data = json.dumps(data)
        yield 'data: ' + data + '\n\n'
        print local_id, ':', data
        time.sleep(0.5)

@app.route('/stream')
def eventstream():
    return flask.Response(eventgen(), mimetype="text/event-stream")

if __name__ == '__main__':    
    app.run(threaded=True)
导入时间,随机
进口烧瓶
从flask导入flask,json
def make_html():
返回“”
var source=neweventsource('/stream');
source.onmessage=函数(事件){
var数据=事件数据;
var logdiv=$('#log');
logdiv.empty();
logdiv.append(“”+数据+“”);
};
日志
日志

""" #----烧瓶应用程序---- app=烧瓶(名称) @应用程序路径(“/”) def index(): 返回make_html() 计数器=0 def eventgen(): 全局计数器 计数器+=1 本地\u id=计数器 msg_count=0 尽管如此: msg_count+=1 数据={'msg':msg_count,'content':random.random(),'local_id':local_id} data=json.dumps(数据) 产生'data:'+data+'\n\n' 打印本地_id“:”,数据 睡眠时间(0.5) @app.route(“/stream”) def eventstream(): return flask.Response(eventgen(),mimetype=“text/event stream”) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app.run(threaded=True)
我似乎找到了这个问题的根源。问题似乎出在AVG冲浪盾链接扫描仪和firefox上。禁用冲浪盾似乎可以解决问题。它已经运行的PC运行的是Avast而不是AVG。我猜这是AVG中的一个错误,应该得到修复。

我似乎已经找到了这个问题的根源。问题似乎出在AVG冲浪盾链接扫描仪和firefox上。禁用冲浪盾似乎可以解决问题。它已经运行的PC运行的是Avast而不是AVG。我猜这是AVG中的一个bug,可能需要修复。值得补充的是完整的答案-感谢您将答案带回来!你真的确定这是一个合理的解决方案吗?似乎你已经确定了客户端,服务器受到了什么影响。而另一个具有相同问题的客户机将再次在服务器上引发问题,您无法对配置错误的客户机甚至恶意客户机采取任何措施。