当前位置: 代码迷 >> 综合 >> webssh(2)各种报错;websocket报错:One or more reserved bits are on: reserved1 = 1, reserved2 = 1, reserved3
  详细解决方案

webssh(2)各种报错;websocket报错:One or more reserved bits are on: reserved1 = 1, reserved2 = 1, reserved3

热度:24   发布时间:2023-11-21 17:56:04.0

websocket报错,异常断开:One or more reserved bits are on: reserved1 = 1, reserved2 = 1, reserved3 = 1

问题描述:

1.django后台dwebsocket库

2.前端term插件

3.前端通过websocket连接后台,后台通过paramiko连接centos

当操作docker ps时返回数据到前端并且websocket马上报错:One or more reserved。。。。。

 

解决方法:

去掉了后台在接收和发送字符时的编码转换,后台不做任何干扰,只做通道作用。

有bug代码情况:

recive = self.channel.recv(1024).decode('utf-8')
if len(recive) != 0:websocket.send(recive)

无bug代码情况:

recive = self.channel.recv(1024)

if len(recive) != 0:websocket.send(recive)

然而:当完全不对主机输出字符做处理时会碰到多种报错如下:

1.A server must not mask any frames that it sends to the client.

2.Invalid frame header

3.Could not decode a text frame as UTF-8

错误原因总结:

原始编码部分不能通过websocket发送,部分转utf-8失败

websocket库源码:

    def send(self, message):'''Send a message to the client. *message* should be convertable to astring; unicode objects should be encodable as utf-8.'''if not self.closed:self.protocol.write(message)protocol.py中:if isinstance(data, six.text_type):   #如果为字符串对象则转utf-8data = data.encode('utf-8')

解决方法:

转base64再通过websocket输出到前端:

base64特点:将二进制转换成另一种二进制,以至于可以打印的英文/数字/+/ /

用来解决:将不可打印内容塞进可打印内容的需求。

我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

https://www.cnblogs.com/whitewen/articles/10456207.html