Could not decode a text frame as UTF-8 的解決
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")
相關文章
- Sublime Text 2報 Decode error - output not utf-8 錯誤的解決辦法Error
- sublime上配置java環境,解決Decode error - output not utf-8問題JavaError
- Many To Many could not initialize proxy – no Session的解決方法Session
- PHP中的Malformed UTF-8 characters錯誤解決PHPORM
- Android: The following classes could not be instantiated: 解決方法Android
- Go:錯誤 could not launch process: EOF 解決Go
- could not autowire. No beans of 'xxxx' 問題解決Bean
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byteUnicodeError
- 詳解iframe與frame的區別
- Sublime Text 3 中文亂碼問題的解決
- 解決text-overflow: ellipsis;不生效的問題
- 關於 artisan migrants Could not find drive 解決方法
- 解決CocoaPods could not find compatible versions for pod "React/Core"React
- mysql中出現Unit mysql.service could not be found 的解決方法MySql
- PyMySQL 獲取資料 'utf-8' codec can't decode byte 0xed in position 2: 錯誤MySql
- Invalid byte 3 of 3-byte UTF-8 sequence 解決方案
- docker 容器指定utf-8編碼,解決中文亂碼Docker
- org.hibernate.exception.SQLGrammarException: could not extract ResultSet解決方案ExceptionSQL
- SyntaxError: Non-ASCII character 與 Cannot decode using encoding "ascii" 錯誤解決ErrorASCIIEncoding
- java.lang.IllegalArgumentException: Could not find class異常解決方式JavaException
- ubuntu解決Could not get lock /var/lib/dpkg/lock-frontendUbuntu
- Could not initialize class sun.awt.X11GraphicsEnvironment解決方案
- netty系列之:netty中的frame解碼器Netty
- 點選劫持漏洞:使用X-Frame-Options 解決方法(應用tomcat)Tomcat
- Intellij IDEA使用@Autowired註解,出現could not autowire錯誤,解決方案IntelliJIdea
- 7.76 DECODE
- Could not obtain transaction-synchronized Session for current thread原因及解決方案AIsynchronizedSessionthread
- Linux下ODBC連線HGDB報Could not SQLConnect錯解決方法LinuxSQL
- 解決Centos7 yum 出現could not retrieve mirrorlist 錯誤CentOS
- 錯誤 qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““ 的解決方法QTPluginPlatformWindows
- Installation did not succeed. The application could not be installed莫名其妙的問題解決APP
- Jou 的解決方案系列:Sublime Text 3 使用之自動儲存
- Encode and Decode Strings
- golang url decodeGolang
- hackmyvm--Decode
- 異常資訊解決:Could not obtain transaction-synchronized Session for current threadAIsynchronizedSessionthread
- PySimpleGUI 引入後VsCode出現問題提示 “could not be resolved” 解決方案GUIVSCode
- 新安裝的Centos7 yum 出現could not retrieve mirrorlist 最終解決方案CentOS