因工作需要开发Scada系统,使用到WebSocket通讯,网页客户端接收数据时发生Could not decode a text frame as UTF-8报错
通过网络检索,有多种说法,验证如下
1、文本针和二进制针的数据发送方式都测试失败
1 string kson = JsonConvert.SerializeObject(myMsg); 2 MessageState state = new MessageState(); 3 // 获取客户端的state 4 sender.Http.GetWsMessageState(item, out state); 5 if (state != null && state.OpCode != OpCode.Close) 6 { 7 var bytes = Encoding.UTF8.GetBytes(kson); 8 //发送文本 9 sender.Send(item, OpCode.Text, bytes, bytes.Length); 10 //发送二进制 11 //sender.Send(item, OpCode.Binary, bytes, bytes.Length); 12 Console.WriteLine($@"ID:{item},Data:{kson}"); 13 }View Code
2、测试发现接收数据10秒钟后报错,更改发送频率后得出结果还是无效
3、最后发现一篇文章得到思路,文章中提到压缩导致的无法正常解析字符串,想过通过网页端的WebSocket进行解压处理可是效果不理想;后来突然想会不会是服务端代码出现了问题,经过对源码的解读发现默认情况加服务端会将客户端发来的Sec-WebSocket-Extensions值进行完全赋值处理,百度过程中发现网页端WebSocket基本状态不会处理压缩数据;最后经过设置服务端代码压缩状态得出以下两种Response Header信息,测试后数据正常接收
解决方法
using (IWebSocketServer server = new WebSocketServer(serverIp) { // 忽略压缩扩展, 不忽略支持数据包压缩解压缩, 主流浏览器都支持 IgnoreCompressionExtensions = true, // 自动发送ping消息的时间间隔 // 毫秒,0不自动发送,默认不发送(多数分机房的防火墙都在1分钟甚至更短时间检测空连接,超时无交互则被踢,如果间隔过长,可能被机房防火墙误杀) // 目前浏览器都不支持在客户端发送ping消息,所以一般在服务器发送ping,在客户端响应接收到ping消息之后再对服务器发送pong,或客户端主动pong,服务器响应pong再发送ping给客户端 PingInterval = 10000, // 最大封包大小 MaxPacketSize = 0x4000, // 子协议, 微信接口等会发送自定义的子协议,询问服务器是不是支持, 如果需要配置请再此配置 SubProtocols = null, })
实际效果对比
参考文档:https://blog.csdn.net/rsjssc/article/details/122794534
标签:HPSocket,WebSocket,ping,bytes,发送,state,报错,客户端 From: https://www.cnblogs.com/yitiancheng/p/17580080.html