WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
Nuget安装TouchSocket
即可,具体步骤详看链接博客。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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; } } |
【WSs服务器】
创建WSs服务器时,其他配置不变,只需要在config
中加入以下代码即可。
在RRQMBox中,放置了一个自制Ssl证书,密码为“RRQMSocket”以供测试。使用配置非常方便。
1 2 3 4 5 6 7 8 9 |
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 }); |
【WS客户端】
1 2 3 4 5 6 7 8 9 |
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("连接成功"); |
WebSocket是支持分片发送的,这是为了解决大数据的传输而设计的,因为像浏览器这种接收缓存不足的组件,没办法一次性接收一个大数据包,所以必须分片。但是在RRQM中,并没有设计自动分片的功能,而是让发送者决定要不要分片,每个数据包应该多大等。
分片的函数也已经封装,以第一个函数为例,前三个参数是定位发送数据,最后一个数据则决定每个数据包应当多少尺寸。
以下列代码为例,则会把data数据,从索引1-8的数据发送,且每个数据包最大长度为4,刚好发送两个包。
RRQM已经重载了数据帧的发送,这意味着您可以发送任意数据类型的数据。
数据帧的类型是WSDataFrame
,它是一个完全开放的数据结构。
当然为方便赋值,RRQM内部已经封装了扩展方法。例如:
一直追加文本。
1 2 3 4 |
WSDataFrame wSDataFrame = new WSDataFrame(); wSDataFrame.AppendText("I"); wSDataFrame.AppendText("love"); wSDataFrame.AppendText("you"); |
一直追加二进制。
1 2 3 4 |
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); |
其扩展方法比较多,大家可以选择适合自己的使用。
from:https://blog.csdn.net/qq_40374647/article/details/122169738