socketio:由于传输错误导致套接字被关闭,导致数据丢失

时间:2019-02-22 16:57:09

标签: javascript python socket.io flask-socketio

我一直在努力解决这个问题,但到目前为止还没有运气。 因此,我正在使用套接字以循环方式从服务器向客户端发送一些数据,但是客户端无法接收所有数据,并且无缘无故在数据传输过程中关闭了套接字。

正如您在下图中所看到的,客户端成功接收数据直到循环的第11次迭代(请参阅下面的服务器代码),但是在该套接字关闭之后,会导致传输错误。我在这里可能做错了什么?

客户端日志

enter image description here

服务器端日志

enter image description here

(Python)服务器端代码

from flask import Flask, render_template, request, flash, redirect, jsonify, make_response
from flask_socketio import SocketIO, emit, disconnect

import time

from gevent import monkey
monkey.patch_all()

app = Flask(__name__)
socketio = SocketIO(app, engineio_logger=True)

@socketio.on('run_tgt')
def run_tg(tg_args):
    for x in range(20):
         time.sleep(2)
         emit('tg_output',x)

if __name__ == "__main__":
socketio.run(app, host='0.0.0.0', debug=True)

(JavaScript)客户端代码

 <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
 var socket = io.connect('http://' + document.domain + ':' + location.port );
 function run_tg() {
     socket.emit('run_tgt', { 'data': 'data'});
     socket.on('tg_output', function(tg_output) {
         console.log(tg_output);
         $("#output_div").append(tg_output);
     });
 }

1 个答案:

答案 0 :(得分:0)

通过在脚本顶部添加猴子补丁来解决此问题

from gevent import monkey
monkey.patch_all()

还将async_handlers设置为true

socketio = SocketIO(app, async_handlers=True, engineio_logger=True)