脚本宝典收集整理的这篇文章主要介绍了【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
【RRQM系】Config配置及其他配置信息介绍
RRQMSocket
RRQMBox
安装RRQMSocket.WebSocket
即可,具体步骤详看链接博客。
VS、Unity安装和使用Nuget包
服务器的创建与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配置
客户端的创建与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());//将文本发送
}
在IWSClientBase
中(客户端实现为WSClient
,服务器实现为WSSocketClient
),已经重写了Send函数,如果直接调用Send发送,则会将数据自动封装为一个二进制数据包发送。
WebSocket是支持分片发送的,这是为了解决大数据的传输而设计的,因为像浏览器这种接收缓存不足的组件,没办法一次性接收一个大数据包,所以必须分片。但是在RRQM中,并没有设计自动分片的功能,而是让发送者决定要不要分片,每个数据包应该多大等。
分片的函数也已经封装,以第一个函数为例,前三个参数是定位发送数据,最后一个数据则决定每个数据包应当多少尺寸。
以下列代码为例,则会把data数据,从索引1-8的数据发送,且每个数据包最大长度为4,刚好发送两个包。
byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
simpleWSClient.SubpackageSend(data,1,8,4);
RRQM已经重载了数据帧的发送,这意味着您可以发送任意数据类型的数据。
数据帧的类型是WSDataFrame
,它是一个完全开放的数据结构。
一直追加文本。
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);
其扩展方法比较多,大家可以选择适合自己的使用。
最后可通过Send的重载函数完成发送。
缺点:
后续计划:
以上是脚本宝典为你收集整理的【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端全部内容,希望文章能够帮你解决【RRQMSocket.WebSocket】C#搭建WebSocket服务器和客户端所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。