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
, я проверю это позже