解决websocket 报 Could not decode a text frame as UTF-8错误

当你使用websocket传输数据时,偶尔可能会出现下面的错误

websocket Could not decode a text frame as UTF-8

网上很多其他文章一上来就介绍什么是websocket,数据协议等等,对解决问题没有多大帮助。

有一些文章说要改开头数字10000001等等,很多同学不知所云。

下面说说个人的经验,不一定对,希望对大家有个帮助。

首先如果你使用的是相对成熟的websocket框架的话,一般不会出现这个问题。

而出现这个问题的原因,绝大部分是客户端和服务器端的指定的 “binaryType” 不一致。

要解决问题,首先要弄清楚问题所在,我们先了解一下这个binaryType是什么:

WebSocket.binaryType 返回websocket连接所传输二进制数据的类型。

它有两个值:

"blob"  如果传输的是 Blob 类型的数据。

"arraybuffer"  如果传输的是 ArrayBuffer 类型的数据。

通常,如果不指定这个值,默认一般是:blob   顾名思义就是任意对象

正常而言,如果binaryType=blob,传输字符串(String)类型,一般没有什么问题。但如果这个时候传一个 byte[] 数组或者二进制数组,可能就会出现Could not decode a text frame as UTF-8 的问题。

对于websocket而言,如果直接传输txt文本。那么opcode一般等于1(opcode是什么可以自行百度)。而直接send byte[] 或者二进制数组时,opcode一般等于2。

当binaryType=blob时,一般会把数据直接当成字符串对象解析,此时如果传递的是byte[]。就会报Could not decode a text frame as UTF-8 的问题。

解决问题:

一般服务器端和客户端指定相同的binaryType即可解决问题。如果传递二进制数据。指定binaryType=arraybuffer,即可获取数据原始二进制数组,这样不管传递的是什么,都不会报错,在自行根据情况处理。

当然,如果是你直接封装的WebSocketFrame,则opcode要指定为二进制

在js中指定:

socket.binaryType='arraybuffer'

以上这篇解决websocket 报 Could not decode a text frame as UTF-8错误就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 实现websocket的两种方式实例详解

    一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring与websocket整合需要spring 4.x,并且使用了socketjs,对不支持websocket的浏览器可以模拟websocket使用 二.方式一:tomcat 使用这种方式无需别的任何配置,只需服务端一个处理类, 服务器端代码 package com.Socket; import java.io

  • 基于java实现websocket协议过程详解

    最近了解了下websocket和socket这个东西,说不得不来说下为何要使用 WebSocket ,和为何不用http. 为何需要WebSocket ? HTTP 协议是一种无状态的.无连接的.单向的应用层协议.它采用了请求/响应模型.通信请求只能由客户端发起,服务端对请求做出应答处理. 这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息. 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦.大多数 Web 应用程序将通过频繁的异步JavaScr

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • 解决websocket 报 Could not decode a text frame as UTF-8错误

    当你使用websocket传输数据时,偶尔可能会出现下面的错误 websocket Could not decode a text frame as UTF-8 网上很多其他文章一上来就介绍什么是websocket,数据协议等等,对解决问题没有多大帮助. 有一些文章说要改开头数字10000001等等,很多同学不知所云. 下面说说个人的经验,不一定对,希望对大家有个帮助. 首先如果你使用的是相对成熟的websocket框架的话,一般不会出现这个问题. 而出现这个问题的原因,绝大部分是客户端和服务器

  • 解决React报错Cannot assign to 'current' because it is a read-only property

    目录 总览 正确的泛型 DOM元素 总览 当我们用一个null值初始化一个ref,但在其类型中不包括null时,就会发生"Cannot assign to 'current' because it is a read-only property"错误.为了解决该错误,请在ref的类型中包含null.比如说,const ref = useRef<string | null>(null) . 这里有个例子来展示错误是如何发生的. // App.tsx import {useEf

  • 解决React报错Parameter 'props' implicitly has an 'any' type

    目录 总览 安装类型文件 声明类型 泛型 重新安装 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter 'props' implicitly has an 'any' type"错误.为了解决这个错误,在你的组件中明确地为props对象设置一个类型. 安装类型文件 你首先要确定的是你已经安装了React类型声明文件.在项目的根目录下打开终端,并运行以下命令. # ️ with NPM npm install --s

  • 解决React报错Property 'value' does not exist on type EventTarget

    目录 总览 正确声明类型 找出类型 总结 总览 当event参数的类型不正确时,会产生"Property 'value' does not exist on type EventTarget"错误.为了解决该错误,将event的类型声明为React.ChangeEvent<HTMLInputElement> .然后就可以通过event.target.value 来访问其值. 这里有个示例用来展示错误是如何发生的. // App.tsx function App() { //

  • 解决React报错Property 'X' does not exist on type 'HTMLElement'

    目录 总览 类型断言 总结 总览 在React中,当我们试图访问类型为HTMLElement 的元素上不存在的属性时,就会发生Property 'X' does not exist on type 'HTMLElement'错误.为了解决该错误,在访问属性之前,使用类型断言来正确地类型声明元素. 这里有三个例子来展示错误是如何发生的. // App.tsx import {useEffect} from 'react'; export default function App() { useEf

  • 解决nginx报错信息 client intended to send too large body: 1331696 bytes

    解决nginx报错信息 client intended to send too large body: 1331696 bytes 1,nginx后台error日志报错 2016/02/05 16:23:56 [error] 12024#0: *441106971 connect() failed (111: Connection refused) while connecting to upstream, client: 113.214.1.10, server: localhost, req

  • 解决python报错MemoryError的问题

    如下: python 32bit 最大只能使用 2G 内存,坑爹之处,超过 2G 报错MemoryError. 而 64bit python则无此限制,所以建议使用 64bit python. 可能存在的问题:以前 numpy.scipy 官方的库只支持 32bit python,现在应该发布了 64bit 对应版本. 以上这篇解决python报错MemoryError的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误

    报错信息 最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序.在程序开发结束开始打包时,却发现一直报错 PyInstaller cannot check for assembly dependencies. Please install PyWin32 or pywin32-ctypes. pip install pypiwin32 但是运行pip install pypiwin32时却提示两个库都已经安装过了 可是当再运行打包脚本时就是死活无法打包,就是提示缺少

  • 解决android报错:Intel HAXM is required to run this AVD

    今天,简单讲解Android 启动模拟器时,提示错误: Intel HAXM is required to run this AVD. VT-x is disabled in BIOS. Enable VT-x in your BIOS security settings (refer to documentation for your computer)的问题. 这个问题其实是Android studio是否下载了Download Intel x86 Emulator Accelerator

  • Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

    在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException),一般可以从以下几个方面着手解决: 1.Frame/Iframe原因定位不到元素: 这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位. 解决方案: 如果iframe

随机推荐