基于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(实际项目上我是做了的),因为这样写大家更容易理解,后面的架构优化大家可以自行发挥~

关于web客户端对接,后面我会再出文章的(才不要烂尾!)~~

时间: 2024-12-29 09:34:34

基于SuperSocket实现的WebSocket(后端)的相关文章

基于SuperSocket实现的WebSocket服务器 和Unity中使用Websocket

孙广东  2016.10.15 http://blog.csdn.NET/u010019717 说一下 Unity客户端的库: 1.websocket-sharp  AS中已经下架了,  https://github.com/sta/websocket-sharp  但是Unity的官方插件 :  Simple Web Sockets for Unity WebGL   就是使用的它 2.Simple Web Sockets for Unity WebGL(推荐)  Unity官方退出的插件 3

基于SuperSocket的IIS主动推送消息给android客户端

在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回收程序池,甚至重起服务器,通常周末接到一个陌生电话,就是说客户端无法登录了,说多了都是泪.痛定思痛,开始找解决方案,其实superwebsocket以IIS做为宿主,就注定他可能不稳定了,当然,它部署非常方便:为了稳定,我开始尝试使用SuperSocket,当然,这也注定了后期部署会麻烦些:生活就是这样哈,鱼

基于hapi的Node.js后端开发

基于hapi的Node.js后端开发 1.背景今年下半年公司线上程序频繁出现问题.不是内存跑满,就是CPU跑满就是程序自己挂掉了.严重影响了现有的小程序业务.目前线上主要架构是dubbo-x搭建的分布式.之前主要用来为app做数据服务.解决思路1:优化现有架构,找到问题(奈何本人虽然写了不少java代码.但是对java基本还是处于一窍不通的状态.)解决思路2:业务分离,为小程序从新搭建一套服务器系统.与原有的互不影响.这样既解决了小程序服务稳定性问题,也流出了时间来处理"思路1",不会

基于node.js 的 websocket的移动端H5直播开发

这一篇介绍一下基于node.js 的 websocket的移动端H5直播开发, 下载文章底部的源码,我是用vscode打开, 首先在第一个终端运行 npm run http-server 这个指令是运行http服务,手机端直接运行http://ip:8000/mpegts.html 即可看到推流过来的视频 新起一个终端运行 npm run ws-server,服务启动后,即可以通过ffmpeg进行推流. 推流过程如下: 推流视频文件: ffmpeg -re -i E:\2.mp4   -code

基于tomcat运行HTML5 WebSocket echo例子

一:概述 作为HTML5新特性之一的WebSocket组件,在实时性有一定要求的WEB应用开发中还是有一定用武之地,高版本的IE.Chrome.FF浏览器都支持Websocket,标准的Websocket通信是基于RFC6455实现服务器端与客户端握手与消息接发的.如果对Websocket通信不是太理解,可以查看RFC文档即可,简单说就是通过发送HTTP请求,实现双方握手,将无状态的HTTP通信协议进一步升级成有状态的通信协议,同时Websocket还支持子协议选项与安全传输.标准的websoc

基于django channel 实现websocket的聊天室

websocket ? 网易聊天室? ? web微信? ? 直播? 假如你工作以后,你的老板让你来开发一个内部的微信程序,你需要怎么办?我们先来分析一下里面的技术难点 消息的实时性? 实现群聊 现在有这样一个需求,老板给到你了,关乎你是否能转正?你要怎么做? 我们先说消息的实时性,按照我们目前的想法是我需要用http协议来做,那么http协议怎么来做那? 是不是要一直去访问我们的服务器,问服务器有没有人给我发消息,有没有人给我发消息?那么大家认为我多长时间去访问一次服务比较合适那? 1分钟1次?

一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器

一.前言 最近花了一个月时间完成了一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器,目前项目代码已基本完成 止步传统CRUD,进阶代码优化: 该项目可根据数据库字段动态生成 controller.mapper.service.html.jsp.vue.php..py ... 等各种类型代码,采用 velocity 模板引擎在页面动态配置生成代码,前后端动态权限配置,前端权限精确到 按钮 级别,后端权限精确到 uri 上,QQ授权第三方单用户登录...等 基本环境: JDK

基于RAP(Mock)实现前后端分离开发

看看RAP的官方定义: 什么是RAP? (Rigel API Platform) 在前后端分离的开发模式下,我们通常需要定义一份接口文档来规范接口的具体信息.如一个请求的地址.有几个参数.参数名称及类型含义等等.RAP 首先方便团队录入.查看和管理这些接口文档,并通过分析结构化的文档数据,重复利用并生成自测数据.提供自测控制台等等... 大幅度提升开发效率. RAP的特色 强大的GUI工具 给力的用户体验,你将会爱上使用RAP来管理您的API文档. 完善的MOCK服务 文档定义好的瞬间,所有接口

基于Ajax技术的前后端Json数据交互方式实现

前言 使用浏览器访问网站是日常生活中必不可少的一件事情,当我们在浏览器地址栏中输入网址后会看到网站的内容,那么这个过程中发生了什么?下面简单介绍下浏览器访问网站过程. 第一步:浏览器向DNS服务器发起DNS请求,DNS服务器解析域名后返回域名对应的网站服务器IP地址第二步:浏览器获取IP地址后向网络服务器发送一个HTTP请求第三步:网络服务器解析浏览器的请求后从数据库获取资源,将生成的html文件封装至HTTP 响应包中,返回至浏览器解析 下图抓包显示了访问"www.baidu.com"