解決websocket 報(bào) Could not decode a text frame as UTF-8錯(cuò)誤
當(dāng)你使用websocket傳輸數(shù)據(jù)時(shí),偶爾可能會(huì)出現(xiàn)下面的錯(cuò)誤
websocket Could not decode a text frame as UTF-8
網(wǎng)上很多其他文章一上來(lái)就介紹什么是websocket,數(shù)據(jù)協(xié)議等等,對(duì)解決問(wèn)題沒(méi)有多大幫助。
有一些文章說(shuō)要改開頭數(shù)字10000001等等,很多同學(xué)不知所云。
下面說(shuō)說(shuō)個(gè)人的經(jīng)驗(yàn),不一定對(duì),希望對(duì)大家有個(gè)幫助。
首先如果你使用的是相對(duì)成熟的websocket框架的話,一般不會(huì)出現(xiàn)這個(gè)問(wèn)題。
而出現(xiàn)這個(gè)問(wèn)題的原因,絕大部分是客戶端和服務(wù)器端的指定的 “binaryType” 不一致。
要解決問(wèn)題,首先要弄清楚問(wèn)題所在,我們先了解一下這個(gè)binaryType是什么:
WebSocket.binaryType 返回websocket連接所傳輸二進(jìn)制數(shù)據(jù)的類型。
它有兩個(gè)值:
"blob" 如果傳輸?shù)氖?Blob 類型的數(shù)據(jù)。
"arraybuffer" 如果傳輸?shù)氖?ArrayBuffer 類型的數(shù)據(jù)。
通常,如果不指定這個(gè)值,默認(rèn)一般是:blob 顧名思義就是任意對(duì)象
正常而言,如果binaryType=blob,傳輸字符串(String)類型,一般沒(méi)有什么問(wèn)題。但如果這個(gè)時(shí)候傳一個(gè) byte[] 數(shù)組或者二進(jìn)制數(shù)組,可能就會(huì)出現(xiàn)Could not decode a text frame as UTF-8 的問(wèn)題。
對(duì)于websocket而言,如果直接傳輸txt文本。那么opcode一般等于1(opcode是什么可以自行百度)。而直接send byte[] 或者二進(jìn)制數(shù)組時(shí),opcode一般等于2。
當(dāng)binaryType=blob時(shí),一般會(huì)把數(shù)據(jù)直接當(dāng)成字符串對(duì)象解析,此時(shí)如果傳遞的是byte[]。就會(huì)報(bào)Could not decode a text frame as UTF-8 的問(wèn)題。
解決問(wèn)題:
一般服務(wù)器端和客戶端指定相同的binaryType即可解決問(wèn)題。如果傳遞二進(jìn)制數(shù)據(jù)。指定binaryType=arraybuffer,即可獲取數(shù)據(jù)原始二進(jìn)制數(shù)組,這樣不管傳遞的是什么,都不會(huì)報(bào)錯(cuò),在自行根據(jù)情況處理。
當(dāng)然,如果是你直接封裝的WebSocketFrame,則opcode要指定為二進(jìn)制
在js中指定:
socket.binaryType='arraybuffer'
以上這篇解決websocket 報(bào) Could not decode a text frame as UTF-8錯(cuò)誤就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Laravel統(tǒng)一錯(cuò)誤處理為JSON的方法介紹
- Android studio 4.1打包失敗和插件錯(cuò)誤提示的解決
- idea中連接數(shù)據(jù)庫(kù)時(shí)出現(xiàn)SSL錯(cuò)誤的問(wèn)題
- spring boot 若依系統(tǒng)整合Ueditor部署時(shí)上傳圖片錯(cuò)誤問(wèn)題
- Python全局變量與global關(guān)鍵字常見錯(cuò)誤解決方案
- 解決SpringMVC使用@RequestBody注解報(bào)400錯(cuò)誤的問(wèn)題
- VUE 項(xiàng)目在IE11白屏報(bào)錯(cuò) SCRIPT1002: 語(yǔ)法錯(cuò)誤的解決
- BMIDE環(huán)境導(dǎo)入項(xiàng)目報(bào)編碼錯(cuò)誤解決方案
相關(guān)文章
Java結(jié)構(gòu)型設(shè)計(jì)模式中的適配器模式與橋接模式解析
這篇文章主要介紹了Java結(jié)構(gòu)型設(shè)計(jì)模式中的適配器模式與橋接模式,結(jié)構(gòu)型設(shè)計(jì)模式是從程序的結(jié)構(gòu)上解決模塊之間的耦合問(wèn)題,需要的朋友可以參考下2016-02-02Mybatis配置映射文件中parameterType的用法講解
這篇文章主要介紹了Mybatis配置映射文件中parameterType的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法
這篇文章主要介紹了JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法,實(shí)例分析了java發(fā)送超文本文件的相關(guān)技巧,需要的朋友可以參考下2015-05-05java科學(xué)計(jì)數(shù)法轉(zhuǎn)換成數(shù)字的幾種方法
我們?cè)谔幚泶髷?shù)值的時(shí)候,常常會(huì)遇到使用科學(xué)計(jì)數(shù)法表示的數(shù)字,科學(xué)計(jì)數(shù)法是一種表示大數(shù)值或小數(shù)值的方式,下面這篇文章主要給大家介紹了關(guān)于java科學(xué)計(jì)數(shù)法轉(zhuǎn)換成數(shù)字的幾種方法,需要的朋友可以參考下2024-03-03idea創(chuàng)建項(xiàng)目沒(méi)有webapp文件夾的解決方法
本文主要介紹了idea創(chuàng)建項(xiàng)目沒(méi)有webapp文件夾的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的
今天帶大家學(xué)習(xí)java隊(duì)列的相關(guān)知識(shí),文章圍繞著如何實(shí)現(xiàn)Java動(dòng)態(tài)循環(huán)隊(duì)列展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06