当前位置:   article > 正文

C#搭建高效、便捷的WebSocket服务器和客户端_c# websocket

c# websocket


一、概述

1.1 什么是WebSocket??

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

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

二、程序集源码、Demo下载

2.1 源码位置
2.2 详细说明文档

文档首页

三、安装

Nuget安装TouchSocket即可,具体步骤详看链接博客。

VS、Unity安装和使用Nuget包

四、创建WebSocket服务器

var service = new HttpService();

service.AddPlugin<WebSocketServerPlugin>().//添加WebSocket功能
   SetWSUrl("/ws").//设定只有特定url能连接。
   SetCallback(WSCallback);//WSCallback回调函数是在WS收到数据时触发回调的。

var config = new RRQMConfig();
config.UsePlugin()
    .SetListenIPHosts(new IPHost[] { new IPHost(7789) });

service.Setup(config).Start();
Console.WriteLine("Http服务器已启动");
Console.WriteLine("WS访问:ws://127.0.0.1:7789/ws");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
static void WSCallback(ITcpClientBase client, WSDataFrameEventArgs e)
{
    switch (e.DataFrame.Opcode)
    {
        case WSDataType.Cont:
            Console.WriteLine($"收到中间数据,长度为:{e.DataFrame.PayloadLength}");
            break;
        case WSDataType.Text:
            Console.WriteLine(e.DataFrame.ToText());
            break;
        case WSDataType.Binary:
            if (e.DataFrame.FIN)
            {
                Console.WriteLine($"收到二进制数据,长度为:{e.DataFrame.PayloadLength}");
            }
            else
            {
                Console.WriteLine($"收到未结束的二进制数据,长度为:{e.DataFrame.PayloadLength}");
            }
            break;
        case WSDataType.Close:
            {
                Console.WriteLine("远程请求断开");
                client.Close("断开");
            }

            break;
        case WSDataType.Ping:
            break;
        case WSDataType.Pong:
            break;
        default:
            break;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

【WSs服务器】

创建WSs服务器时,其他配置不变,只需要在config中加入以下代码即可。

RRQMBox中,放置了一个自制Ssl证书,密码为“RRQMSocket”以供测试。使用配置非常方便。

var config = new RRQMConfig();
config.UsePlugin()
    .SetReceiveType(ReceiveType.Auto)
    .SetListenIPHosts(new IPHost[] { new IPHost(7789) })
    .SetServiceSslOption(new ServiceSslOption() //Ssl配置,当为null的时候,相当于创建了ws服务器,当赋值的时候,相当于wss服务器。
    { 
        Certificate = new X509Certificate2("RRQMSocket.pfx", "RRQMSocket"), 
        SslProtocols = SslProtocols.Tls12 
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

五、创建WebSocket客户端

【WS客户端】

WebSocketClient myWSClient = new WebSocketClient();
myWSClient.Setup(new RRQMConfig()
        .SetRemoteIPHost("ws://127.0.0.1:7789/ws")
        .SetSingletonLogger(new LoggerGroup(new ConsoleLogger(), new FileLogger())));
    myWSClient.Connect();

    //myWSClient.Received += this.MyWSClient_Received; 客户端接收

    myWSClient.Logger.Message("连接成功");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

六、发送数据

6.1 直接发送

在这里插入图片描述

6.2 分片发送

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

分片的函数也已经封装,以第一个函数为例,前三个参数是定位发送数据,最后一个数据则决定每个数据包应当多少尺寸。
在这里插入图片描述
以下列代码为例,则会把data数据,从索引1-8的数据发送,且每个数据包最大长度为4,刚好发送两个包。

6.3 发送数据帧

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

数据帧的类型是WSDataFrame,它是一个完全开放的数据结构。
在这里插入图片描述
当然为方便赋值,RRQM内部已经封装了扩展方法。例如:

一直追加文本。

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

  • 1
  • 2
  • 3
  • 4
  • 5

一直追加二进制。

 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);

  • 1
  • 2
  • 3
  • 4
  • 5

其扩展方法比较多,大家可以选择适合自己的使用。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/164633
推荐阅读
相关标签
  

闽ICP备14008679号