.Net使⽤SuperSocket框架实现WebSocket后端
关于WebSocket其实很早就想发了,奈何之前项⽬中的WebSocket的后端不是我做的,⽽我⼜想前后端都发出来和⼤家讨论讨论~于是挤出点时间研究了⼀下WebSocket的后端实现(所以才有了这篇⽂章)。
⾸先是概念导论,现在⼤家在百度、⾕歌很容易就能搜索到⼀⼤堆这样的、(太多了就不⼀⼀列举)
看过这些概念导论以后,我们准备先实现WebSocket的服务端(基础概念都没掌握的童鞋们需要补课了)。
说到的WebSocket实现,就不得不说SuperSocket,你可以了解和下载它。
看过上⾯链接以后,你应该知道它是有多好⽤的⼯具,接下来我们就可以搭建我们的WebSocketServer了:
⾸先,创建⼀个窗体应⽤程序(winForm),当然你也可以创建控制台应⽤程序。
然后,需要将下载好的这⼏个DLL引⼊你的项⽬中:SuperSocket.Common、SuperSocket.SocketBase、SuperSocket.SocketEngine、SuperWebSocket、log4net
其中SuperSocket相关类库版本为1.6,SuperWebSocket版本为0.9,log4net为1.2(版本错误可能会出⼀些谁也看不懂的碧油鸡)。
接下来,我们需要声明⼀个webSocket对象,并且给它绑定好事件,⽐如这样:
WebSocketServer ws = new WebSocketServer();
ws.NewMessageReceived += Ws_NewMessageReceived;//当有信息传⼊时
ws.NewSessionConnected += Ws_NewSessionConnected;//当有⽤户连⼊时
ws.SessionClosed += Ws_SessionClosed;//当有⽤户退出时
ws.NewDataReceived += Ws_NewDataReceived;//当有数据传⼊时
if (ws.Setup(10086))//绑定端⼝
ws.Start();//启动服务
注释标注的应该清楚,不过这⾥我没有对传⼊数据做操作,各位看官可以忽略不计。
接下来我们应该怎么做呢?答案是重写⽣成的事件⽅法。很容易看出我们要先处理⽤户连⼊和退出,并且保存和移除⽤户信息(不然你都不知道你在和谁聊天),⽐如这样:
Dictionary<WebSocketSession, string> userlist = new Dictionary<WebSocketSession, string>();//⽤户列表
眼尖的同学们⼀定发现了⼀个新类型:WebSocketSession,它是做什么的呢?F12进去以后是这样的:
貌似什么都没有?别急,我们再看它的⽗类:
到这⾥很多⼈就明⽩了,关于连⼊⽤户的诸多信息都在这个类内,还提供了Send⽅法以便于Server端与之通讯。
搞明⽩WebSocketSession类型能做什么以后,就可以针对不同操作进⾏响应了
客户端在连⼊服务端时,需要发送⼀串信息来告诉服务端“who i am”,这时就需要动⽤Ws_NewMessageReceived事件的⽅法。
如:客户端连⼊时,向服务端发送了“{'user':'001号学⽣','active':'login'}”,那么我们就可以在服务端将该⽤户的信息存储⾄上⾯定义好的userlist中:
//添加⾄⽤户集合的⽅法
public void AddUser(string UserName, WebSocketSession session)
websocket和socket{
userList.Add(session, UserName);
}
//login对应封装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是告诉发给所有⽤户还是当前⽤户
service.AddUser(Respon["user"], curUser);//将当前⽤户添加⾄⽤户集合
}
return Respon;
}
//有新消息传⼊时
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);//全部发送
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);//针对发送
break;
}
}
这⾥我封装成dic只是为了简单调⽤,⼤家不习惯可以封装成别的(⽐如List<T>),下⾯是Send和SendTo:
//发送给所有⽤户
public void Send(string msg)
{
foreach (var item in userList)
{
item.Key.Send(msg);
}
}
//发送给单个⽤户
public void SendTo(WebSocketSession session, string msg)
{
session.Send(msg);
}
其实公聊就是给所有的连⼊⽤户做个遍历⼴播,⽽私聊只需要针对某⽤户⼴播即可。
⾄此,基于SuperSocket实现的WebSocketServer就已经被简单实现了。
本⽂中并没有抽出接⼝,也没有做IOC(实际项⽬上我是做了的),因为这样写⼤家更容易理解,后⾯的架构优化⼤家可以⾃⾏发挥~
到此这篇关于.Net使⽤SuperSocket框架实现WebSocket后端的⽂章就介绍到这了。希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论