文章目錄
- 一、概述
- 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特性
- 性能卓越,和同類產品相比,性能提升20%左右,這得益于強大的RRQMSocket,
- 封裝優雅,從TCP繼承封裝,能夠發送不分包的大資料,也能發送分片的小資料,
- 決議簡單,在收到訊息后,已經將資料幀轉換為資料物件,可通過列舉值判斷資料型別,通過布林值判斷FIN,RSV1-3等資料,
- 能夠直接發送二進制資料,也能直接發送文本,
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發送,則會將資料自動封裝為一個二進制資料包發送,

6.2 分片發送
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);
6.3 發送資料幀
RRQM已經多載了資料幀的發送,這意味著您可以發送任意資料型別的資料,
資料幀的型別是WSDataFrame,它是一個完全開放的資料結構,

當然為方便賦值,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);
其擴展方法比較多,大家可以選擇適合自己的使用,

最后可通過Send的多載函式完成發送,
七、缺點和后續計劃
缺點:
- 暫不支持ssl,
- 暫不支持代理,
后續計劃:
- 克服缺點
- 提供檔案傳輸功能,
- 提供RPC功能,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/395091.html
標籤:其他
