天天看點

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

作者:信安傳遞

一、概述

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 直接發送

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

6.2 分片發送

WebSocket是支援分片發送的,這是為了解決大資料的傳輸而設計的,因為像浏覽器這種接收緩存不足的元件,沒辦法一次性接收一個大資料包,是以必須分片。但是在RRQM中,并沒有設計自動分片的功能,而是讓發送者決定要不要分片,每個資料包應該多大等。

分片的函數也已經封裝,以第一個函數為例,前三個參數是定位發送資料,最後一個資料則決定每個資料包應當多少尺寸。

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

以下列代碼為例,則會把data資料,從索引1-8的資料發送,且每個資料包最大長度為4,剛好發送兩個包。

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

6.3 發送資料幀

RRQM已經重載了資料幀的發送,這意味着您可以發送任意資料類型的資料。

資料幀的類型是WSDataFrame,它是一個完全開放的資料結構。

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

當然為友善指派,RRQM内部已經封裝了擴充方法。例如:

一直追加文本。

WSDataFrame wSDataFrame = new WSDataFrame();

wSDataFrame.AppendText("I");

wSDataFrame.AppendText("love");

wSDataFrame.AppendText("you");

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

一直追加二進制。

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

其擴充方法比較多,大家可以選擇适合自己的使用方法。

「網絡攻防」C#搭建高效、便捷的WebSocket伺服器和用戶端

————————————————

版權聲明:本文為CSDN部落客「若汝棋茗」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/qq_40374647/article/details/122169738

繼續閱讀