【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

文章目录

    • 一、概述
        • 1.1 什么是WebSocket??
        • 1.2 RRQMSocket.WebSocket特性
        • 1.3 Config配置详解
    • 二、程序集源码、Demo下载
        • 2.1 源码位置
        • 2.2 Demo位置
    • 三、安装
    • 四、创建WebSocket服务器
    • 五、创建WebSocket客户端
    • 六、发送数据
        • 6.1 直接发送
        • 6.2 分片发送
        • 6.3 发送数据帧
    • 七、缺点和后续计划


一、概述

1.1 什么是WebSocket??

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

1.2 RRQMSocket.WebSocket特性

  1. 性能卓越,和同类产品相比,性能提升20%左右,这得益于强大的RRQMSocket。
  2. 封装优雅,从TCP继承封装,能够发送不分包的大数据,也能发送分片的小数据。
  3. 解析简单,在收到消息后,已经将数据帧转换为数据对象,可通过枚举值判断数据类型,通过布尔值判断FIN,RSV1-3等数据。
  4. 能够直接发送二进制数据,也能直接发送文本。

1.3 Config配置详解

【RRQM系】Config配置及其他配置信息介绍


二、程序集源码、Demo下载

2.1 源码位置

RRQMSocket

2.2 Demo位置

RRQMBox

三、安装

安装RRQMSocket.WebSocket即可,具体步骤详看链接博客。

VS、Unity安装和使用Nuget包

四、创建WebSocket服务器

服务器的创建与TCP系一致,可以常规从WSService继承,然后再继承WSSocketClient指定泛型,也可以直接从SimpleWSService中实例化。下列代码从SimpleWSService示例。

SimpleWSService wSService = new SimpleWSService();
wSService.Connected += (client,e) =>
{
    //客户端完成连接
};

wSService.Received += (client, dataFrame) =>
{
    switch (dataFrame.Opcode)
    {
        case WSDataType.Cont:
            Console.WriteLine($"收到中间数据,长度为:{dataFrame.PayloadLength}");
            break;
        case WSDataType.Text:
            Console.WriteLine(dataFrame.GetMessage());
            break;
        case WSDataType.Binary:
            if (dataFrame.FIN)
            {
                Console.WriteLine($"收到二进制数据,长度为:{dataFrame.PayloadLength}");
            }
            else
            {
                Console.WriteLine($"收到未结束的二进制数据,长度为:{dataFrame.PayloadLength}");
            }
            break;
        case WSDataType.Close:
            break;
        case WSDataType.Ping:
            break;
        case WSDataType.Pong:
            break;
        default:
            break;
    }

    client.Send(dataFrame.PayloadData);//将收到的数据回发
};
wSService.Setup(7789).Start();//此处简单配置,详细配置看Config配置

五、创建WebSocket客户端

客户端的创建与TcpClient一致,可以常规从WSClient继承,也可以直接从SimpleWSClient中实例化。下列代码从SimpleWSClient示例。

SimpleWSClient simpleWSClient = new SimpleWSClient();
simpleWSClient.Setup("127.0.0.1:7789").Connect();
simpleWSClient.Received += (client, dataFrame) =>
            {
                switch (dataFrame.Opcode)
                {
                    case WSDataType.Cont:
                        Console.WriteLine($"收到中间数据,长度为:{dataFrame.PayloadLength}");
                        break;
                    case WSDataType.Text:
                        Console.WriteLine(dataFrame.GetMessage());
                        break;
                    case WSDataType.Binary:
                        if (dataFrame.FIN)
                        {
                            Console.WriteLine($"收到二进制数据,长度为:{dataFrame.PayloadLength}");
                        }
                        else
                        {
                            Console.WriteLine($"收到未结束的二进制数据,长度为:{dataFrame.PayloadLength}");
                        }
                        break;
                    case WSDataType.Close:
                        break;
                    case WSDataType.Ping:
                        break;
                    case WSDataType.Pong:
                        break;
                    default:
                        break;
                }
            };
while (true)
{
    simpleWSClient.Send(Console.ReadLine());//将文本发送
}

六、发送数据

6.1 直接发送

IWSClientBase中(客户端实现为WSClient,服务器实现为WSSocketClient),已经重写了Send函数,如果直接调用Send发送,则会将数据自动封装为一个二进制数据包发送。

【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端

6.2 分片发送

WebSocket是支持分片发送的,这是为了解决大数据的传输而设计的,因为像浏览器这种接收缓存不足的组件,没办法一次性接收一个大数据包,所以必须分片。但是在RRQM中,并没有设计自动分片的功能,而是让发送者决定要不要分片,每个数据包应该多大等。

分片的函数也已经封装,以第一个函数为例,前三个参数是定位发送数据,最后一个数据则决定每个数据包应当多少尺寸。

【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端

以下列代码为例,则会把data数据,从索引1-8的数据发送,且每个数据包最大长度为4,刚好发送两个包。

byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
simpleWSClient.SubpackageSend(data,1,8,4);

6.3 发送数据帧

RRQM已经重载了数据帧的发送,这意味着您可以发送任意数据类型的数据。

数据帧的类型是WSDataFrame,它是一个完全开放的数据结构。

【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端

当然为方便赋值,RRQM内部已经封装了扩展方法。例如:

一直追加文本。

WSDataFrame wSDataFrame = new WSDataFrame();
wSDataFrame.AppendText("I");
wSDataFrame.AppendText("love");
wSDataFrame.AppendText("you");

一直追加二进制。

 WSDataFrame wSDataFrame = new WSDataFrame();
 wSDataFrame.AppendBinary(new byte[] { 1 }, 0, 1);
 wSDataFrame.AppendBinary(new byte[] { 2 }, 0, 1);
 wSDataFrame.AppendBinary(new byte[] { 3 }, 0, 1);

其扩展方法比较多,大家可以选择适合自己的使用。

【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端

最后可通过Send的重载函数完成发送。

七、缺点和后续计划

缺点:

  1. 暂不支持ssl。
  2. 暂不支持代理。

后续计划:

  1. 克服缺点
  2. 提供文件传输功能。
  3. 提供RPC功能。

脚本宝典总结

以上是脚本宝典为你收集整理的【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端全部内容,希望文章能够帮你解决【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: