.Net使用SuperSocket框架实现WebSocket后端

 更新时间:2022年01月20日 08:46:12   作者:老马-Max  
这篇文章介绍了.Net使用SuperSocket框架实现WebSocket后端,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

关于WebSocket其实很早就想发了,奈何之前项目中的WebSocket的后端不是我做的,而我又想前后端都发出来和大家讨论讨论~于是挤出点时间研究了一下WebSocket的后端实现(所以才有了这篇文章)。

首先是概念导论,现在大家在百度、谷歌很容易就能搜索到一大堆这样的socket(百度百科)Socket详解(太多了就不一一列举)

看过这些概念导论以后,我们准备先实现WebSocket的服务端(基础概念都没掌握的童鞋们需要补课了)。

说到.net的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)
   {
       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后端的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • .NET微信公众号开发之查询自定义菜单

    .NET微信公众号开发之查询自定义菜单

    本文给大家讲述的是.NET微信公众号开发系列文章的第三篇,主要给大家讲解下查询自定义菜单的相关内容,有需要的小伙伴可以参考下。
    2015-07-07
  • asp.net中如何批量导出access某表内容到word文档

    asp.net中如何批量导出access某表内容到word文档

    最近有项目需求是这样的,需要将某表中的每一条记录中的某些内容导出在一个word文档中。下面小编就把我的解决办法分享给大家,供大家参考
    2015-10-10
  • asp.net 设置GridView的选中行

    asp.net 设置GridView的选中行

    当点某行时,直接选中,然后移动方向键则切换不同的选中行; 如果直接按方向键,则从第一行开始标识
    2009-04-04
  • Element NavMenu导航菜单的使用方法

    Element NavMenu导航菜单的使用方法

    这篇文章主要介绍了Element NavMenu导航菜单的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Aspose.Cells 读取受保护有密码的Excel文件

    Aspose.Cells 读取受保护有密码的Excel文件

    这篇文章主要介绍了Aspose.Cells 读取受保护有密码的Excel文件,简单实用,需要的朋友可以参考下。
    2016-06-06
  • .NET使用System.Timers.Timer类实现程序定时执行

    .NET使用System.Timers.Timer类实现程序定时执行

    这篇文章介绍了.NET使用System.Timers.Timer类实现程序定时执行的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • .Net MVC实现长轮询

    .Net MVC实现长轮询

    这篇文章主要为大家详细介绍了.Net MVC实现长轮询的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)

    ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)

    这篇文章主要介绍了ASP.NET MVC5网站开发之管理员登录、验证和注销,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 如何将Winform移植到.NET Core 3.0

    如何将Winform移植到.NET Core 3.0

    这篇文章主要介绍了如何将Winform移植到.NET Core 3.0,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • .Net Core微信服务商二次进件的开发

    .Net Core微信服务商二次进件的开发

    这篇文章主要介绍了.Net Core微信服务商二次进件的开发,包括服务商证书获取方法及查询进件状态的详细代码,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10

最新评论