Python - сбой соединения websocket, когда длина данных websocket превышает некоторое значение - PullRequest
0 голосов
/ 04 декабря 2018

1.websocket реализация: пакет python от github с именем dwebsocket, который основан на старой версии django, поэтому приложение wsgi создается django (кажется, что для python2.7 реализации сервера websocket не так много вариантов)

2.wsgi сервер: gevent.wsgi.WSGIServer

3.Мы отправляем тестовые данные 'x'*2**17 с сервера на клиент, (c2s выглядит одинаково)

4. Поведение:клиент встретил исключение и получил Could not decode a text frame as UTF-8, и соединение было закрыто.(Opcode -1 в браузере Devtools network ws frames)

  • о сетевом пакете:

    кажется, что на разных машинах длины есть разные дроссели, которые вызывают сбой, на некоторых машинах2 ** 16 достаточно, чтобы вызвать сбой, в любом случае я использую 'x'*2**17 для тестирования, и я использовал wireshark с обеих сторон для захвата пакета, а на стороне сервера иногда он не мог захватить какие-либо данные (поэтому он не был отправлен?), а иногда и огромное количество разбросанных пакетов ws, как показано ниже:

    WebSocket 0... .... = Fin: False .111 .... = Reserved: 0x07 .... 1000 = Opcode: Connection Close (8) 0... .... = Mask: False .111 1000 = Payload length: 120 Payload Close: 787878787878787878787878787878787878787878787878... Close: Unknown (30840) Reason: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  • о коде:

    Я отследил код dwebsocketи никаких исключений не произошло вообще (совершенно точно), то есть до тех пор, пока оно не войдет в gevent.socket.send, внутри этого python raw socket, код вроде:

    sock = self._sock if timeout is timeout_default: timeout = self.timeout try: return sock.send(data, flags) все еще не исключение, и это всесделано после этого

  • несколько простых тестов

    Попытка использовать https://pypi.org/project/WSGIserver/ для замены WSGIServer gevent, и проблема остается.так что, я думаю, речь идет не о сервере wsgi.

    Пробовал хорошо известный websocketd для простого сервера, и он хорошо работает.

В любом случае, я думаю, что проблема возникаетиз реализации websocket dwebsocket, но я не знаю, как пойти дальше, чтобы проверить это, понятия не имел о вещах tcp.

Обновлено 17 декабря: пробовал autobahn для сервера веб-сокетов, и он работает очень хорошо, вероятно, данные, упакованные для сокета, где-то не так в dwebsocket, я проверю это позже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...