Подтвердить что ты не робот

OSError: raw readinto() возвращает недопустимую длину при использовании websockets

Я пытаюсь проверить мое веб-приложение в фляже с помощью websockets Мой код работает хорошо, но когда я перезагружаю страницу с двумя или более раз в браузере. У меня в терминале OSError. И эта ошибка не мешает работе фляжки.

main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Chat</title>
    <script type="text/javascript" src="{{ url_for('static', filename='jquery-2.2.0.js') }}"></script>
    <script type="text/javascript" src="{{ url_for('static', filename='socket.io.min.js') }}"></script>
</head>
<body>

<script type="text/javascript" charset="utf-8">

     $(document).ready(function() {

         var socket = io.connect('http://' + document.domain + ':' + location.port);

         socket.emit('connect', {data: 'U connected'});

         socket.on('apply', function (e) {
            console.log('it works');
                $('#log').append('<br>' + e.data + '<br>')

        });

     });

</script>

<h1 id="log"></h1>
</body>
</html>

app.py

from flask_socketio import SocketIO, emit
from flask import Flask, render_template


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socket_io = SocketIO(app)


@app.route('/')
def index():
    return render_template('main.html')


@socket_io.on('connect')
def connect():
    emit('apply', {'data': "Connect"})

if __name__ == '__main__':
    socket_io.run(app, debug=True)

Traceback

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/eventlet/greenpool.py", line 82, in _spawn_n_impl
    func(*args, **kwargs)
  File "/usr/local/lib/python3.5/site-packages/eventlet/wsgi.py", line 703, in process_request
    proto.__init__(sock, address, self)
  File "/usr/local/lib/python3.5/socketserver.py", line 684, in __init__
    self.handle()
  File "/usr/local/lib/python3.5/http/server.py", line 417, in handle
    self.handle_one_request()
  File "/usr/local/lib/python3.5/site-packages/eventlet/wsgi.py", line 315, in handle_one_request
    self.raw_requestline = self.rfile.readline(self.server.url_length_limit)
OSError: raw readinto() returned invalid length -1 (should have been between 0 and 8192)

Что означает ошибка?

4b9b3361

Ответ 1

Слепой снимок, но это поведение, скорее всего, вызвано тем, что веб-браузер заканчивает соединение с websocket перед отправкой чего-либо. Обновление браузера, вероятно, приводит к тому, что websocket закрывает его (в противном случае повторно) соединение tcp. На флаконе это вызывает OSError, который ожидает несколько байтов, но умирает, ожидая данных, когда сокет закрыт.

Другими словами: ничего нельзя сделать и фактически не вредно.

Ответ 2

Я пытался решить ошибку различными способами, но для меня это не сработало. Поэтому через некоторое время я переустановил Ubuntu, и мой сервер начал работать.

Вероятно, проблема связана с сокетами операционной системы, или я не установил что-то должным образом. Это меня недоразумение.

Оставив эти комментарии, чтобы помочь кому-то, но он все еще открыт и не полностью разрешен.