一、概述
1.1 什麼是WebSocket??
WebSocket是一種在單個TCP連接配接上進行全雙工通信的協定。WebSocket通信協定于2011年被IETF定為标準RFC 6455,并由RFC7936補充規範。WebSocket API也被W3C定為标準。
WebSocket使得用戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向用戶端推送資料。在WebSocket API中,浏覽器和伺服器隻需要完成一次握手,兩者之間就直接可以建立持久性的連接配接,并進行雙向資料傳輸。
1.2 TouchSocket特性
性能卓越,和同類産品相比,性能提升20%左右,這得益于強大的RRQMSocket。
封裝優雅,從TCP繼承封裝,能夠發送不分包的大資料,也能發送分片的小資料。
解析簡單,在收到消息後,已經将資料幀轉換為資料對象,可通過枚舉值判斷資料類型,通過布爾值判斷FIN,RSV1-3等資料。
能夠直接發送二進制資料,也能直接發送文本。
支援Ssl。
二、程式集源碼、Demo下載下傳
2.1 源碼位置
Gitee
Github
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");
static void WSCallback(ITcpClientBase client, WSDataFrameEventArgs e)
{
switch (e.DataFrame.Opcode)
{
case WSDataType.Cont:
Console.WriteLine(#34;收到中間資料,長度為:{e.DataFrame.PayloadLength}");
break;
case WSDataType.Text:
Console.WriteLine(e.DataFrame.ToText());
break;
case WSDataType.Binary:
if (e.DataFrame.FIN)
{
Console.WriteLine(#34;收到二進制資料,長度為:{e.DataFrame.PayloadLength}");
}
else
{
Console.WriteLine(#34;收到未結束的二進制資料,長度為:{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”以供測試。使用配置非常友善。
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
});
五、建立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("連接配接成功");
六、發送資料
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");
一直追加二進制。
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);
其擴充方法比較多,大家可以選擇适合自己的使用方法。
————————————————
版權聲明:本文為CSDN部落客「若汝棋茗」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/qq_40374647/article/details/122169738