首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python龙卷风SSL websocket连接

Python龙卷风SSL websocket连接
EN

Stack Overflow用户
提问于 2017-04-13 11:29:12
回答 2查看 1.5K关注 0票数 0

我使用的是用Python3.5编码的websocket服务器。这是需要提供我的网站实时信息。

我使用的“服务器”-library称为龙卷风 (版本4.5b2),它处理websocket连接和http请求。为了向后兼容(如果浏览器还不支持websocket ),我使用python库sockjs-tor非典(Version1.0.3),它还为websocket连接添加了一些附加特性。

现在,我的问题是,如果启动服务器,控制台中就会出现很多龙卷风ssl错误。它不会崩溃,但如果大约80个客户端连接到websocket,则会经常发生3次错误。我使用加密连接,它可以工作,但一些客户端会被踢出websocket连接,如果其中一个错误发生。

Python脚本使用多个线程,服务器受到cloudflare的保护,cloudflare是某种中间人,它将每个请求重定向到服务器或用户。

以下是三个错误:

代码语言:javascript
复制
​
ERROR:tornado.general:Uncaught exception, closing connection.
Traceback (most recent call last):
  File "/home/website/python/tornado/iostream.py", line 523, in _handle_events
    self._handle_write()
  File "/home/website/python/tornado/iostream.py", line 1398, in _handle_write
    super(SSLIOStream, self)._handle_write()
  File "/home/website/python/tornado/iostream.py", line 847, in _handle_write
    assert self._write_buffer_size >= 0
AssertionError
ERROR:tornado.application:Exception in callback None
Traceback (most recent call last):
  File "/home/website/python/tornado/ioloop.py", line 888, in start
    handler_func(fd_obj, events)
  File "/home/website/python/tornado/stack_context.py", line 277, in null_wrapper
    return fn(*args, **kwargs)
  File "/home/website/python/tornado/iostream.py", line 523, in _handle_events
    self._handle_write()
  File "/home/website/python/tornado/iostream.py", line 1398, in _handle_write
    super(SSLIOStream, self)._handle_write()
  File "/home/website/python/tornado/iostream.py", line 847, in _handle_write
    assert self._write_buffer_size >= 0
AssertionError

此错误不像第一个错误那样经常出现。

代码语言:javascript
复制
ERROR:tornado.application:Uncaught exception GET /sockjs/398/ssputw1s/websocket
HTTPServerRequest(protocol='https', host='****.com:8443', method='GET', uri='/sockjs/398/ssputw1s/websocket', version='HTTP/1.1', remote_ip='****', headers={'Accept-Encoding': 'gzip', 'Cf-Visitor': '{"scheme":"https"}', 'Sec-Websocket-Key': '****', 'Host': '****.com:8443', 'X-Forwarded-Proto': 'https', 'Cache-Control': 'no-cache', 'Sec-Websocket-Version': '13', 'Cf-Ipcountry': 'FR', 'X-Forwarded-For': '****', 'Sec-Websocket-Extensions': 'x-webkit-deflate-frame', 'Origin': 'https://****.com', 'Cf-Connecting-Ip': '****', 'Cookie': '****', 'Upgrade': 'websocket', 'Cf-Ray': '34edb1a17c456908-CDG', 'User-Agent': '****', 'Connection': 'Upgrade', 'Pragma': 'no-cache'})
Traceback (most recent call last):
  File "/home/website/python/tornado/web.py", line 1464, in _stack_context_handle_exception
    raise_exc_info((type, value, traceback))
  File "<string>", line 4, in raise_exc_info
  File "/home/website/python/tornado/stack_context.py", line 316, in wrapped
    ret = fn(*args, **kwargs)
  File "/home/website/python/tornado/websocket.py", line 865, in _on_masked_frame_data
    self._on_frame_data(_websocket_mask(self._frame_mask, data))
  File "/home/website/python/tornado/websocket.py", line 910, in _on_frame_data
    self._receive_frame()
  File "/home/website/python/tornado/websocket.py", line 784, in _receive_frame
    self.stream.read_bytes(2, self._on_frame_start)
  File "/home/website/python/tornado/iostream.py", line 324, in read_bytes
    self._try_inline_read()
  File "/home/website/python/tornado/iostream.py", line 711, in _try_inline_read
    pos = self._read_to_buffer_loop()
  File "/home/website/python/tornado/iostream.py", line 625, in _read_to_buffer_loop
    if self._read_to_buffer() == 0:
  File "/home/website/python/tornado/iostream.py", line 738, in _read_to_buffer
    chunk = self.read_from_fd()
  File "/home/website/python/tornado/iostream.py", line 1487, in read_from_fd
    chunk = self.socket.read(self.read_chunk_size)
  File "/usr/lib64/python3.5/ssl.py", line 799, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib64/python3.5/ssl.py", line 585, in read
    v = self._sslobj.read(len)
ssl.SSLWantWriteError: The operation did not complete (write) (_ssl.c:2090)

有时会出现这样的错误:

代码语言:javascript
复制
ERROR:tornado.general:Uncaught exception, closing connection.
Traceback (most recent call last):
  File "/home/website/python/tornado/iostream.py", line 523, in _handle_events
    self._handle_write()
  File "/home/website/python/tornado/iostream.py", line 1398, in _handle_write
    super(SSLIOStream, self)._handle_write()
  File "/home/website/python/tornado/iostream.py", line 872, in _handle_write
    del self._write_buffer[:self._write_buffer_pos]
BufferError: Existing exports of data: object cannot be re-sized
ERROR:tornado.application:Exception in callback None
Traceback (most recent call last):
  File "/home/website/python/tornado/ioloop.py", line 888, in start
    handler_func(fd_obj, events)
  File "/home/website/python/tornado/stack_context.py", line 277, in null_wrapper
    return fn(*args, **kwargs)
  File "/home/website/python/tornado/iostream.py", line 523, in _handle_events
    self._handle_write()
  File "/home/website/python/tornado/iostream.py", line 1398, in _handle_write
    super(SSLIOStream, self)._handle_write()
  File "/home/website/python/tornado/iostream.py", line 872, in _handle_write
    del self._write_buffer[:self._write_buffer_pos]
BufferError: Existing exports of data: object cannot be re-sized
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-14 15:22:02

这看起来就像龙卷风4.5b2中的一个bug,这个问题正在本期中讨论。寻找在4.5b3或4.5Final中修复它,同时您可以回到4.4版本。

票数 1
EN

Stack Overflow用户

发布于 2017-04-13 18:50:52

看起来像库中的一个bug --也就是说,争用条件导致多个实体同时使用相同的写缓冲区。

  • 第一个错误- _write_buffer_size潜流-另一个实体在不合适时从它读取
  • 第三个错误-当它不应该是使用中缓冲器

要捕获它,您需要跟踪所有使用_write_buffers和更改_write_buffer_sizes的操作,以及它们的来源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43391082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档