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

本文解决了一个关于WebSocket连接异常断开的问题,特别是在使用Django的dwebsocket库和前端term插件时遇到的编码问题。通过调整编码方式并采用base64编码来传输数据,解决了原始编码无法通过WebSocket正确传输的问题。

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 a
        string; 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-8
            data = data.encode('utf-8')

解决方法:

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

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

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

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

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值