websocket-sharp 是一个websocket的C#实现,支持.net 3.5及以上来开发服务端或者客户端。本文主要介绍用websocket-sharp来做服务端、JavaScript做客户端来实现一个简单的IM。

WebSocketBehavior

WebSocketBehavior是核心对象,他包含了OnOpen,OnMessage,OnClose,OnError四个方法以及一个Sessions对象。熟悉websocket的都知道前四个方法是用来处理客户端链接、发送消息、链接关闭以及出错。sessions就是用来管理所有的回话连接。每产生一个连接,都会有一个新Id,sessions中会新增一个IWebSocketSession对象。当页面关闭或者刷新都会触发OnClose,继而sessions中会移除对应的IwebSocketSession对象。

WebSocketSessionManager 有一个广播方法:Sessions.Broadcast,通知所有连接的客户端。而WebSocketBehavior中的Send相当于是单发,只能将消息发送到此刻连接的一个客户端。摸清了以上这些我们就可以做一个简单的IM了。

Websoket.Server

新建一个C#控制台程序。现在Nugget中添加websocket-sharp.已经JSON。

然后新增一个Chat类,继承WebSocketBehavior,Chat相当于是一个websocket的服务,你可以创建多个websocketBehavior的实例然后在挂载在websocketServer上。

 public class Chat : WebSocketBehavior{private  Dictionary<string,string> nameList=new Dictionary<string, string>();protected override async Task OnMessage(MessageEventArgs e){StreamReader reader = new StreamReader(e.Data);string text = reader.ReadToEnd();try{var obj = Json.JsonParser.Deserialize<JsonDto>(text);Console.WriteLine("收到消息:" + obj.content + " 类型:" + obj.type + " id:" + Id);switch (obj.type){//正常聊天case "1":obj.name = nameList[Id];await Sessions.Broadcast(Json.JsonParser.Serialize(obj));break;//修改名称case "2":Console.WriteLine("{0}修改名称{1}",nameList[Id],obj.content);Broadcast(string.Format("{0}修改名称{1}", nameList[Id], obj.content),"3");nameList[Id] = obj.content;break;default:await Sessions.Broadcast(text);break;}}catch (Exception exception){Console.WriteLine(exception);}//await Send(text);
        }protected override async Task OnClose(CloseEventArgs e){Console.WriteLine("连接关闭" + Id);Broadcast(string.Format("{0}下线,共有{1}人在线", nameList[Id], Sessions.Count), "3");nameList.Remove(Id);}protected override async Task OnError(WebSocketSharp.ErrorEventArgs e) {var el = e;}protected override async Task OnOpen(){Console.WriteLine("建立连接"+Id);nameList.Add(Id,"游客"+Sessions.Count);Broadcast(string.Format("{0}上线了,共有{1}人在线", nameList[Id],Sessions.Count), "3");}private void Broadcast(string msg, string type = "1"){var data= new  JsonDto(){content = msg,type = type,name = nameList[Id]};Sessions.Broadcast(Json.JsonParser.Serialize(data));}}

JsonDto

    class JsonDto{public string content { get; set; }public string type { get; set; }public string name { get; set; }}

View Code

这里用nameList来管理所有的链接Id和用户名称的对应关系,新上线的人都默认为游客。然后再OnMessage中定义了三种消息类型。1表示正常聊天,2表示修改名称。3表示系统通知。用来让前端做一些界面上的区分。

然后在Program中启动WebSocketServer。下面指定了8080端口。

  public class Program{public static void Main(string[] args){var wssv = new WebSocketServer(null,8080);wssv.AddWebSocketService<Chat>("/Chat");wssv.Start();Console.ReadKey(true);wssv.Stop();}}

Client

html:

 <div id="messages"></div><input type="text" id="content" value=""/><button id="sendbt">发送</button><div>昵称:<input type="text" id="nickName"  /> <button id="changebt">修改</button> </div>

View Code

js:

 function initWS() {ws = new WebSocket("ws://127.0.0.1:8080/Chat");ws.onopen = function (e) {console.log("Openened connection to websocket");console.log(e);};ws.onclose = function () {console.log("Close connection to websocket");// 断线重连
            initWS();}ws.onmessage = function (e) {console.log("收到",e.data)var div=$("<div>");var data=JSON.parse(e.data);switch(data.type){case "1":div.html(data.name+":"+data.content);break;case "2":div.addClass("gray");div.html("修改名称"+data.content)break;case "3":div.addClass("gray");div.html(data.content)break;}$("#messages").append(div);}}initWS();function sendMsg(msg,type){ws.send(JSON.stringify({content:msg,type:type}));}$("#sendbt").click(function(){var text=$("#content").val();sendMsg(text,"1")$("#content").val("");})$("#changebt").click(function(){var text=$("#nickName").val();sendMsg(text,"2")})

运行效果:

是不是很方便~~,喜欢就赞一个。

源码:https://files.cnblogs.com/files/stoneniqiu/websocket-sharp.zip

websocket-sharp:http://sta.github.io/websocket-sharp/

nodejs 实现websocket服务端:http://www.cnblogs.com/stoneniqiu/p/5402311.html

基于WebSocketSharp 的IM 简单实现相关推荐

  1. 【转】基于WebSocketSharp 的IM 简单实现

    websocket-sharp 是一个websocket的C#实现,支持.net 3.5及以上来开发服务端或者客户端.本文主要介绍用websocket-sharp来做服务端.JavaScript做客户 ...

  2. 基于qml创建最简单的图像处理程序(1)-基于qml创建界面

    <基于qml创建最简单的图像处理程序>系列课程及配套代码 基于qml创建最简单的图像处理程序(1)-基于qml创建界面 http://www.cnblogs.com/jsxyhelu/p/ ...

  3. python怎么建立画板_Python基于opencv实现的简单画板功能示例

    本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true ...

  4. 把一个dataset的表放在另一个dataset里面_视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响)...

    视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响) 今天介绍一个我们近期做的关于视频自监督的简单工作: Self-supervised learning using ...

  5. NA-NP-IE系列实验26: 基于链路的OSPF 简单口令认证

    实验26: 基于链路的OSPF 简单口令认证 1.实验目的 通过本实验可以掌握: (1)OSPF 认证的类型和意义 (2)基于链路的OSPF 简单口令认证的配置和调试 2.实验拓扑 本实验的拓扑结构如 ...

  6. 【项目实战课】人人免费可学!基于Pytorch的图像分类简单任务数据增强实战

    欢迎大家来到我们的项目实战课,本期内容是<基于Pytorch的图像分类简单任务数据增强实战>.所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的 ...

  7. 一款基于RxJava2+Retrofit2实现简单易用的网络请求框架

    本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置, ...

  8. 基线系统需要受到更多关注:基于词向量的简单模型 | ACL 2018论文解读

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  9. 基于.NET Core的简单,跨平台,模块化的电子商务系统-SimplCommerce

    SimplCommerce是基于.NET Core的简单,跨平台,模块化的电子商务系统 官网:www.simplcommerce.com 开源地址:https://github.com/simplco ...

最新文章

  1. Spring mvc Data Redis—Pub/Sub(附Web项目源码)
  2. 数据链路层、交换机内容整合
  3. 《数据库SQL实战》获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
  4. MySQL的变量分类总结
  5. rhel mysql安装_RHEL6.4下MySQL安装方法及简单配置
  6. 《性能测试从零开始--LoadRunner入门》读书笔记(四)
  7. 丁腈橡胶自然老化时间_东莞元耀:解析抗UV老化试验箱正确的操作流程步骤
  8. mysql按首数字分表_MySql基础-数据分表
  9. 大数据分析 | 百年奥运往事知多少
  10. 3分钟tips:什么是特征向量?什么是特征值?
  11. openstack排错
  12. linux 新老软件切换,Linux下非常重要的软件切换命令
  13. ubuntu 安装配置mysql
  14. Tracepro中up vector和normal vector的定义1
  15. 手机电视应走免费之路
  16. python调用高德接口获取国内行政区经纬度数据
  17. 分享几个好用的导航导航网站
  18. Redis常用数据结构及其场景归纳
  19. 凡走过必留下痕迹|2019年个人总结
  20. MSP430学习心得

热门文章

  1. 如何发布第一个属于自己的npm包
  2. S_ISREG等几个常见的宏(转)
  3. 二叉树——数据结构课堂作业
  4. API的 Signature(签名)Token(令牌) 认证
  5. DLM - stackglue 层
  6. Linux平台 Oracle 11gR2 RAC安装Part1:准备工作
  7. 设置元素浮动的几种方式
  8. [转]Zend Framework + Smarty 应用实例
  9. android真实项目教程(七)——梦醒边缘花落_by_CJJ
  10. CODING 最佳实践:快课网研发效能提升之路 1