流在firefox断开连接后没有终止
我正在尝试创建一个使用sse将数据传输到客户端的Flask服务器。 下面这段测试代码似乎可以解决问题,但我偶然发现了一个与处理客户端断开连接有关的问题。
当使用Firefox作为客户端(版本28或29)时,数据按预期开始流式传输。 但是,当我重新加载页面时,会打开一个新流(如预期的那样),但旧流仍然存在。 处理流的eventgen()线程永远不会终止。 在其他客户端(我使用Yaffle的Polyfill EventSource实现以及Chrome尝试IE)时,重新加载或关闭页面会导致客户端断开连接,从而导致服务器端套接字错误10053(客户端与主机断开连接)。 这终止了循环,并且仅保持活动流活着,这是预期的行为。
使用Process Explorer时,我注意到客户端(Firefox)端的TCP连接挂起状态为FIN_WAIT2,而服务器端的连接挂起状态为CLOSE_WAIT。 奇怪的是,在运行Firefox的3台机器(全部是Win 7 x64)中,有一台测试了它,断开连接正确处理。 在Python 2.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 + 'nn'
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)
我似乎已经找到了这个问题的根源。 这个问题似乎与AVG surf-shield链接扫描器和Firefox有关。 禁用冲浪盾似乎可以解决问题。 它已经工作的PC运行Avast而不是AVG。 我猜这是AVG中的一个错误,应该可以修复。
链接地址: http://www.djcxy.com/p/20461.html上一篇: stream not terminated after firefox disconnects
下一篇: A strange behavior for regualr sqlite operation on android