1.websocket实现:来自github的名为dwebsocket
的python软件包,该软件包基于旧版本的django,因此wsgi应用程序是由django创建的(似乎websocket服务器的python2.7没有太多选择实施)
2.wsgi服务器:gevent.wsgi.WSGIServer
3。我们从服务器向客户端发送测试数据'x'*2**17
,(c2似乎相同)
4。行为:客户端遇到异常并得到Could not decode a text frame as UTF-8
,并且连接被关闭。 (在浏览器Devtools网络ws框架中为Opcode -1
)
关于网络数据包:
似乎在不同长度的机器上有不同的油门会导致崩溃,在某些机器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/
替换gevent的WSGIServer,问题仍然存在。所以我想这与wsgi服务器无关。
尝试将著名的websocketd
用于简单的服务器,并且效果很好。
无论如何,我认为问题出在websocket实现dwebsocket
上,但是我不知道如何进一步检查它,对tcp事情一无所知。
12月17日更新:针对Websocket服务器尝试了autobahn
,它确实运行良好,可能dwebsocket
中为套接字打包的数据有误,我稍后会检查