.Net使用SuperSocket框架實(shí)現(xiàn)WebSocket后端
關(guān)于WebSocket其實(shí)很早就想發(fā)了,奈何之前項(xiàng)目中的WebSocket的后端不是我做的,而我又想前后端都發(fā)出來(lái)和大家討論討論~于是擠出點(diǎn)時(shí)間研究了一下WebSocket的后端實(shí)現(xiàn)(所以才有了這篇文章)。
首先是概念導(dǎo)論,現(xiàn)在大家在百度、谷歌很容易就能搜索到一大堆這樣的socket(百度百科)、Socket詳解(太多了就不一一列舉)
看過(guò)這些概念導(dǎo)論以后,我們準(zhǔn)備先實(shí)現(xiàn)WebSocket的服務(wù)端(基礎(chǔ)概念都沒(méi)掌握的童鞋們需要補(bǔ)課了)。
說(shuō)到.net的WebSocket實(shí)現(xiàn),就不得不說(shuō)SuperSocket,你可以點(diǎn)擊這里了解和下載它。
看過(guò)上面鏈接以后,你應(yīng)該知道它是有多好用的工具,接下來(lái)我們就可以搭建我們的WebSocketServer了:
首先,創(chuàng)建一個(gè)窗體應(yīng)用程序(winForm),當(dāng)然你也可以創(chuàng)建控制臺(tái)應(yīng)用程序。
然后,需要將下載好的這幾個(gè)DLL引入你的項(xiàng)目中:SuperSocket.Common、SuperSocket.SocketBase、SuperSocket.SocketEngine、SuperWebSocket、log4net
其中SuperSocket相關(guān)類庫(kù)版本為1.6,SuperWebSocket版本為0.9,log4net為1.2(版本錯(cuò)誤可能會(huì)出一些誰(shuí)也看不懂的碧油雞)。
接下來(lái),我們需要聲明一個(gè)webSocket對(duì)象,并且給它綁定好事件,比如這樣:
WebSocketServer ws = new WebSocketServer();
ws.NewMessageReceived += Ws_NewMessageReceived;//當(dāng)有信息傳入時(shí)
ws.NewSessionConnected += Ws_NewSessionConnected;//當(dāng)有用戶連入時(shí)
ws.SessionClosed += Ws_SessionClosed;//當(dāng)有用戶退出時(shí)
ws.NewDataReceived += Ws_NewDataReceived;//當(dāng)有數(shù)據(jù)傳入時(shí)
if (ws.Setup(10086))//綁定端口
ws.Start();//啟動(dòng)服務(wù) 注釋標(biāo)注的應(yīng)該清楚,不過(guò)這里我沒(méi)有對(duì)傳入數(shù)據(jù)做操作,各位看官可以忽略不計(jì)。
接下來(lái)我們應(yīng)該怎么做呢?答案是重寫(xiě)生成的事件方法。很容易看出我們要先處理用戶連入和退出,并且保存和移除用戶信息(不然你都不知道你在和誰(shuí)聊天),比如這樣:
Dictionary<WebSocketSession, string> userlist = new Dictionary<WebSocketSession, string>();//用戶列表
眼尖的同學(xué)們一定發(fā)現(xiàn)了一個(gè)新類型:WebSocketSession,它是做什么的呢?F12進(jìn)去以后是這樣的:

貌似什么都沒(méi)有?別急,我們?cè)倏此母割悾?/p>

到這里很多人就明白了,關(guān)于連入用戶的諸多信息都在這個(gè)類內(nèi),還提供了Send方法以便于Server端與之通訊。
搞明白WebSocketSession類型能做什么以后,就可以針對(duì)不同操作進(jìn)行響應(yīng)了
客戶端在連入服務(wù)端時(shí),需要發(fā)送一串信息來(lái)告訴服務(wù)端“who i am”,這時(shí)就需要?jiǎng)佑肳s_NewMessageReceived事件的方法。
如:客戶端連入時(shí),向服務(wù)端發(fā)送了“{'user':'001號(hào)學(xué)生','active':'login'}”,那么我們就可以在服務(wù)端將該用戶的信息存儲(chǔ)至上面定義好的userlist中:
//添加至用戶集合的方法
public void AddUser(string UserName, WebSocketSession session)
{
userList.Add(session, UserName);
}
//login對(duì)應(yīng)封裝dic方法
public Dictionary<string, string> login(Dictionary<string, string> Query, T curUser)
{
UserConnHandle userConn = () => { return Query["userid"]; };
Dictionary<string, string> Respon = new Dictionary<string, string>();
if (!service.userList.ContainsKey(curUser))
{
if (Query["user"] == "" || Query["user"] == null)
{
Respon.Add("user", Guid.NewGuid().ToString().Replace("-", ""));
}
else
{
Respon.Add("userid", Query["userid"]);
}
Respon.Add("type", "1");//為了前端更容易操作
Respon.Add("send", "0");//這里0是告訴發(fā)給所有用戶還是當(dāng)前用戶
service.AddUser(Respon["user"], curUser);//將當(dāng)前用戶添加至用戶集合
}
return Respon;
}
//有新消息傳入時(shí)
private void Ws_NewMessageReceived(WebSocketSession session, string value)
{
Dictionary<string, string> res = login(value, session, this) as Dictionary<string, string>;
switch (res["send"])
{
case "0":
res.Remove("send");
Send(res);//全部發(fā)送
break;
case "1":
res.Remove("send");
string username = res["to"];
WebSocketSession keys = userlist.Where(q => q.Value == username).Select(q => q.Key).First();
SendTo(keys, res);//針對(duì)發(fā)送
break;
}
}這里我封裝成dic只是為了簡(jiǎn)單調(diào)用,大家不習(xí)慣可以封裝成別的(比如List<T>),下面是Send和SendTo:
//發(fā)送給所有用戶
public void Send(string msg)
{
foreach (var item in userList)
{
item.Key.Send(msg);
}
}
//發(fā)送給單個(gè)用戶
public void SendTo(WebSocketSession session, string msg)
{
session.Send(msg);
}其實(shí)公聊就是給所有的連入用戶做個(gè)遍歷廣播,而私聊只需要針對(duì)某用戶廣播即可。
至此,基于SuperSocket實(shí)現(xiàn)的WebSocketServer就已經(jīng)被簡(jiǎn)單實(shí)現(xiàn)了。
本文中并沒(méi)有抽出接口,也沒(méi)有做IOC(實(shí)際項(xiàng)目上我是做了的),因?yàn)檫@樣寫(xiě)大家更容易理解,后面的架構(gòu)優(yōu)化大家可以自行發(fā)揮~
到此這篇關(guān)于.Net使用SuperSocket框架實(shí)現(xiàn)WebSocket后端的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何在ASP.NET Core類庫(kù)項(xiàng)目中讀取配置文件詳解
這篇文章主要給大家介紹了關(guān)于如何在ASP.NET Core類庫(kù)項(xiàng)目中讀取配置文件的相關(guān)資料,這是朋友提的一個(gè)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳解,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2017-10-10
asp.net多選項(xiàng)卡頁(yè)面的創(chuàng)建及使用方法
看了很多朋友還不會(huì)創(chuàng)建多選項(xiàng)卡的頁(yè)面,特地總結(jié)了一下用法,看一遍就會(huì)了,感興趣的朋友可以參考下2013-01-01
ASP.NET?Core?MVC中的標(biāo)簽助手(TagHelper)用法
這篇文章介紹了ASP.NET?Core?MVC中標(biāo)簽助手(TagHelper)的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
使用VSCode開(kāi)發(fā)和調(diào)試.NET Core程序的方法
這篇文章主要介紹了使用VSCode開(kāi)發(fā)和調(diào)試.NET Core程序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
.net開(kāi)發(fā):為程式碼加上行號(hào)的方法詳解
這篇文章介紹了.net開(kāi)發(fā):為程式碼加上行號(hào)的方法,有需要的朋友可以參考一下2013-11-11
C#實(shí)現(xiàn)上傳照片到物理路徑,并且將地址保存到數(shù)據(jù)庫(kù)的小例子
這篇文章主要介紹了c#上傳圖片,并將地址保存到數(shù)據(jù)庫(kù)中的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-12-12
一個(gè)簡(jiǎn)答的Access下的分頁(yè)asp.net代碼
一個(gè)簡(jiǎn)答的Access下的分頁(yè)asp.net代碼2010-03-03
巧妙使用JQuery Clone 添加多行數(shù)據(jù),并更新到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
巧妙使用JQuery Clone 添加多行數(shù)據(jù),并更新到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-12-12

