Python 服务端实时持续发送数据给前端无法收到,如何解决?
本人是新手,第一次尝试写个简单功能,已经被折腾好几天了
我用 flask 框架, flask-socketio 。写了一个服务器端实时传送数据展示在前端的程序,但是问题是,前端无法收到后端发送的数据,全部阻塞在服务器上了
前端也无法收到后端的数据,但是我的 websocket 管道已经建立
5d81f64ec0d14cc5a5a70c075caaefdd: Received request to upgrade to websocket
5d81f64ec0d14cc5a5a70c075caaefdd: Received packet MESSAGE data 2[“message”,{“data”:“hello”}]
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet MESSAGE data 2[“server_response”,{“data”:“welcome”}]
127.0.0.1 - - [01/Mar/2017 15:19:35] “POST /socket.io/?EIO=3&transport=polling&t=Lg8lGsx&sid=5d81f64ec0d14cc5a5a70c075caaefdd HTTP/1.1” 200 219 0.001000
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet NOOP data None
127.0.0.1 - - [01/Mar/2017 15:19:35] “GET /socket.io/?EIO=3&transport=polling&t=Lg8lGsx.0&sid=5d81f64ec0d14cc5a5a70c075caaefdd HTTP/1.1” 200 260 0.000000
5d81f64ec0d14cc5a5a70c075caaefdd: Upgrade to websocket successful
想问一下 各位大神,我的问题出在哪里,有没有什么好的解决办法。
前端触发 onclick 后,发送的全是空:
5d81f64ec0d14cc5a5a70c075caaefdd: Received packet MESSAGE data 2[“message”,{“data”:“wawawa”}]
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet MESSAGE data 2[“server_response”,{“data”:""}]
5d81f64ec0d14cc5a5a70c075caaefdd: Received packet MESSAGE data 2[“message”,{“data”:“aaaaa”}]
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet MESSAGE data 2[“server_response”,{“data”:""}]
5d81f64ec0d14cc5a5a70c075caaefdd: Received packet MESSAGE data 2[“message”,{“data”:“dsdaaf”}]
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet MESSAGE data 2[“server_response”,{“data”:""}]
5d81f64ec0d14cc5a5a70c075caaefdd: Received packet MESSAGE data 2[“message”,{“data”:“ddddwdad”}]
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet MESSAGE data 2[“server_response”,{“data”:""}]
5d81f64ec0d14cc5a5a70c075caaefdd: Received packet MESSAGE data 2[“message”,{“data”:“adadeeel”}]
5d81f64ec0d14cc5a5a70c075caaefdd: Sending packet MESSAGE data 2[“server_response”,{“data”:""}]
代码:
服务端:
@socketio.on(‘connect_event’)
def connectevent(job_name):
if job_name[‘data’] == ‘hello’:
emit(‘serverresponse’,{‘data’:‘welcome’})
else:
log_command = [‘tailf’,’/var/log/messages’]
log_out = subprocess.Popen(log_command,stdout=subprocess.PIPE)
while log_out:
out = log_out.stdout.readline().strip()
emit(‘serverresponse’,{‘data’:out})
while 里 print out ,是可以打印出来的,但是 emit 的时候却无法发送给前端
前端:
var socket = io.connect(‘http://’ + document.domain + ‘:’ + location.port);
var name = ‘hello’
function jobname(name){
socket.emit(‘connect_event’,{‘data’:name});
return false;
};
socket.on(‘connect’, function() {
socket.emit(‘connect_event’,{‘data’:name});
})
socket.on(‘serverresponse’, function(msgg) {
console.log(msgg)
$(’#loog’).append(’<br>’ + $(’<div/>’).text(msgg.data).html());
});
Python 服务端实时持续发送数据给前端无法收到,如何解决?
这个问题通常出在连接保持或数据格式上。我遇到过类似情况,一般是这几个地方有问题:
1. 检查连接头 服务端必须设置正确的响应头来保持连接:
response_headers = [
('Content-Type', 'text/event-stream'),
('Cache-Control', 'no-cache'),
('Connection', 'keep-alive'),
('Access-Control-Allow-Origin', '*') # 如果是跨域
]
2. 确保数据格式正确
SSE要求特定格式,每条消息以data:开头,以两个换行结束:
def generate_data():
while True:
# 你的数据逻辑
yield f"data: {json.dumps(your_data)}\n\n"
3. 完整示例
from flask import Flask, Response
import json
import time
app = Flask(__name__)
@app.route('/stream')
def stream():
def event_stream():
while True:
# 模拟实时数据
data = {"time": time.time(), "value": "实时数据"}
yield f"data: {json.dumps(data)}\n\n"
time.sleep(1)
return Response(
event_stream(),
mimetype="text/event-stream",
headers={
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Access-Control-Allow-Origin': '*'
}
)
if __name__ == '__main__':
app.run(threaded=True)
前端用EventSource连接:
const source = new EventSource('http://your-server/stream');
source.onmessage = (event) => {
console.log(JSON.parse(event.data));
};
常见坑点:
- 忘记
\n\n结束符 - 没设置
keep-alive - Nginx默认会缓冲,需要加
proxy_buffering off; - 防火墙或代理中断了长连接
先检查控制台有没有连接错误,再看网络面板里SSE连接状态。
总结:检查连接头和消息格式。
=。=吓得刚准备用 flask-socketio 的我立马去试
搞定了,
emit 后面加 socketio.sleep(0)

