Could not decode a text frame as UTF-8 的解決

ShellCollector發表於2019-03-03

 

 

Could not decode a text frame as UTF-8 的解決

 

 

我準備用谷歌的protobuf作為前後端通訊的協議。


但是從伺服器傳送Message物件到web的時候爆了這個錯。很奇怪是什麼意思,我明明發的是二進位制資料啊,何來的text。。。。

又去網上找了一下websocket的一些介紹,發現一張圖

websocket的訊息是分片傳送的,每一片的開頭定義了基本的資訊。如這張圖顯示的。第0位0或1表示是不是連續分片的最後一片,123位必須是0,4567四位是一個16進位制數字。這個數字是0代表附加資料,1代表文字,2代表二進位制資料。

原來就是這4位定義了資料格式。。。

回去看socket庫的原始碼,它在開頭寫入了一個數字“129”。這個數字轉成二進位制後“10000001”,果然和網上說的一樣。趕緊改成130(10000002),從新試了一下

不報錯了,破費!

 

def send_img(msg,data_length):
    send_msg = b""  # 使用bytes格式,避免後面拼接的時候出現異常
    send_msg += b"\x82"
    back_str = []
    back_str.append('\x81')

    data_length = len(msg)  # 可能有中文內容傳入,因此計算長度的時候需要轉為bytes資訊
    # if PRINT_FLAG:
    print("INFO: send message  len is %d" % (data_length))
    # 資料長度的三種情況
    if data_length <= 125:  # 當訊息內容長度小於等於125時,資料幀的第二個位元組0xxxxxxx 低7位直接標示訊息內容的長度
        send_msg += str.encode(chr(data_length))
    elif data_length <= 65535:  # 當訊息內容長度需要兩個位元組來表示時,此位元組低7位取值為126,由後兩個位元組標示資訊內容的長度
        send_msg += struct.pack('b', 126)
        send_msg += struct.pack('>h', data_length)
    elif data_length <= (2 ^ 64 - 1):  # 當訊息內容長度需要把個位元組來表示時,此位元組低7位取值為127,由後8個位元組標示資訊內容的長度
        send_msg += struct.pack('b', 127)
        send_msg += struct.pack('>q', data_length)
    else:
        print(u'太長了')
    send_message = send_msg+msg
    global conn_dict_face
    if conn_dict_face:
        print('has conn********************')
    for connection in conn_dict_face.values():
        if send_message != None:
            try:
                print("send")
                #if not connection._closed:
                timestr = datetime.datetime.now().strftime('%H:%M:%S:%f')
                log_info(timestr, 'send_message_test')
                connection.send(send_message)
            except Exception as e:
                log_info('send error', e)
                connection.close()
        else:
            log_info("msg_test is none")

相關文章