关于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客户端对接,后面我会再出文章的(才不要烂尾!)~~

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

  1. 基于SuperSocket实现的WebSocket(前端)

    本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...

  2. c#基于supersocket的简单websocket服务端收发消息实现

    using log4net; using SuperSocket.SocketBase; using SuperSocket.WebSocket; using System; using System ...

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

    在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回 ...

  4. 一款基于Netty开发的WebSocket服务器

    代码地址如下:http://www.demodashi.com/demo/13577.html 一款基于Netty开发的WebSocket服务器 这是一款基于Netty框架开发的服务端,通信协议为We ...

  5. 基于spring security 实现前后端分离项目权限控制

    前后端分离的项目,前端有菜单(menu),后端有API(backendApi),一个menu对应的页面有N个API接口来支持,本文介绍如何基于spring security实现前后端的同步权限控制. ...

  6. 使用go,基于martini,和websocket开发简易聊天室

    一.首先,需要了解一下websocket基本原理:here 二.go语言的websocket实现: 基于go语言的websocket也有不少,比如github.com/gorilla/websocke ...

  7. 在nginx环境下搭建基于ssl证书的websocket服务转发,wss

    1.证书准备 本地调试,可以安装自签名证书,安装方法参考https本地自签名证书添加到信任证书访问 2.修改配置文件 将上面的配置文件拷贝到conf目录,添加或者修改节点如下 # HTTPS serv ...

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

    这一篇介绍一下基于node.js 的 websocket的移动端H5直播开发, 下载文章底部的源码,我是用vscode打开, 首先在第一个终端运行 npm run http-server 这个指令是运 ...

  9. 基于node.js的websocket 前后端交互小功能

    一.node var ws = require("nodejs-websocket"); console.log("开始建立连接...") var server ...

随机推荐

  1. [未完成][Mooc]关于Linxu的总结(一)

    视频1:Linux之前有个Minix(这个是一个教授用来教学用的)开源的,不是编译过的,不能通过QQ.exe找到其源码.后来Linus这个家伙搞了一个Linux.服务器领域超过百分之八十.linux是 ...

  2. 【数论】UVa 11526 - H(n)

    What is the value this simple C++ function will return? long long H(int n) { ; ; i <= n; i=i+ ) { ...

  3. 仿QQ注册验证码的实现。

    最近发现一些网站的验证码全部换成了“极验”和“点触”的,发现QQ的注册也是与“点触”的相似.就想尝试实现一个. 先上效果图: 下面贴上主要思路及代码: 第一步:得到常用汉字列表 public stat ...

  4. AngularJS Boostrap Pagination Sample

    首先,样式是这样的 首先,Service端是Webapi REST JSON格式 第二,我们建立一个Wrapper Class,这里你也可以定义一个Generic<T>,作为示例,我们这里 ...

  5. sql常识-BETWEEN 操作符

    BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. SQL BETWEEN 语法 SELECT column_name(s ...

  6. JavaScript之表格修改

    讲到表格,我们不免都了解它的属性及用途. colspan跨列(纵向的)和rowspan跨行(横向的). 表格中<tr></tr>标签标示行标签:<td></t ...

  7. asp.net字符串分割函数用法

    先来看个简单的实例 但是其数组长度却是25,而不是3.下面这种方法是先将“[111cn.net]”替换成一个特殊字符,比如$,在根据这个字符执行Split 例如下面我要根据[111cn.net]分割的 ...

  8. 分享:在微信公众平台做HTML5游戏经验谈(转载与http://software.intel.com/zh-cn/blogs/2013/04/03/html5)

    分享:在微信公众平台做HTML5游戏经验谈 Dawei Cheng 程大伟... 于 星期三, 03/04/2013 - 03:19 提交 最近微信公众游戏平台讨论得如火如荼,大有HTML5游戏即将引 ...

  9. 第四篇、CocoaPods 镜像的更新 原来的淘宝镜像已经不再更新

    在开发应用,我们常常使用cocoaPods来管理第三方框架,但是原来的淘宝的镜像不更新了 新的镜像地址:https://gems.ruby-china.org/

  10. (转)Spark安装与学习

    摘要:Spark是继Hadoop之后的新一代大数据分布式处理框架,由UC Berkeley的Matei Zaharia主导开发.我只能说是神一样的人物造就的神器,详情请猛击http://www.spa ...