记录使用HPSocket.NET包开发WebSocket通讯,报错Could not decode a text frame as UTF-8

发布时间 2023-07-25 16:28:43作者: 易天塍

因工作需要开发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