解決websocket 報 Could not decode a text frame as UTF-8錯誤
當(dāng)你使用websocket傳輸數(shù)據(jù)時,偶爾可能會出現(xiàn)下面的錯誤
websocket Could not decode a text frame as UTF-8
網(wǎng)上很多其他文章一上來就介紹什么是websocket,數(shù)據(jù)協(xié)議等等,對解決問題沒有多大幫助。
有一些文章說要改開頭數(shù)字10000001等等,很多同學(xué)不知所云。
下面說說個人的經(jīng)驗,不一定對,希望對大家有個幫助。
首先如果你使用的是相對成熟的websocket框架的話,一般不會出現(xiàn)這個問題。
而出現(xiàn)這個問題的原因,絕大部分是客戶端和服務(wù)器端的指定的 “binaryType” 不一致。
要解決問題,首先要弄清楚問題所在,我們先了解一下這個binaryType是什么:
WebSocket.binaryType 返回websocket連接所傳輸二進(jìn)制數(shù)據(jù)的類型。
它有兩個值:
"blob" 如果傳輸?shù)氖?Blob 類型的數(shù)據(jù)。
"arraybuffer" 如果傳輸?shù)氖?ArrayBuffer 類型的數(shù)據(jù)。
通常,如果不指定這個值,默認(rèn)一般是:blob 顧名思義就是任意對象
正常而言,如果binaryType=blob,傳輸字符串(String)類型,一般沒有什么問題。但如果這個時候傳一個 byte[] 數(shù)組或者二進(jìn)制數(shù)組,可能就會出現(xiàn)Could not decode a text frame as UTF-8 的問題。
對于websocket而言,如果直接傳輸txt文本。那么opcode一般等于1(opcode是什么可以自行百度)。而直接send byte[] 或者二進(jìn)制數(shù)組時,opcode一般等于2。
當(dāng)binaryType=blob時,一般會把數(shù)據(jù)直接當(dāng)成字符串對象解析,此時如果傳遞的是byte[]。就會報Could not decode a text frame as UTF-8 的問題。
解決問題:
一般服務(wù)器端和客戶端指定相同的binaryType即可解決問題。如果傳遞二進(jìn)制數(shù)據(jù)。指定binaryType=arraybuffer,即可獲取數(shù)據(jù)原始二進(jìn)制數(shù)組,這樣不管傳遞的是什么,都不會報錯,在自行根據(jù)情況處理。
當(dāng)然,如果是你直接封裝的WebSocketFrame,則opcode要指定為二進(jìn)制
在js中指定:
socket.binaryType='arraybuffer'
以上這篇解決websocket 報 Could not decode a text frame as UTF-8錯誤就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb實現(xiàn)用戶登錄注冊功能實例代碼(基于Servlet+JSP+JavaBean模式)
這篇文章主要基于Servlet+JSP+JavaBean開發(fā)模式實現(xiàn)JavaWeb用戶登錄注冊功能實例代碼,非常實用,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧2016-05-05
基于CopyOnWriteArrayList并發(fā)容器(實例講解)
下面小編就為大家?guī)硪黄贑opyOnWriteArrayList并發(fā)容器(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Spring實戰(zhàn)之使用注解實現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用注解實現(xiàn)聲明式事務(wù)操作,結(jié)合實例形式詳細(xì)分析了spring使用注解實現(xiàn)聲明式事務(wù)相關(guān)配置、接口實現(xiàn)與使用技巧,需要的朋友可以參考下2020-01-01
Java super關(guān)鍵字用法實戰(zhàn)案例分析
這篇文章主要介紹了Java super關(guān)鍵字用法,結(jié)合具體案例形式分析了java super關(guān)鍵字調(diào)用父類構(gòu)造方法、屬性及方法等相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-09-09
Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)圖文詳解
優(yōu)先級隊列是比棧和隊列更專用的結(jié)構(gòu),在多數(shù)情況下都非常有用,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)的相關(guān)資料,需要的朋友可以參考下2022-03-03

