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

WebSocketBehavior

WebSocketBehavior是核心对象,他包含了OnOpen,OnMessage,OnClose,OnError四个事件(回调)以及一个Sessions对象和一个Send方法。熟悉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; }}

这里用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>

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. Windows Server 2008 禁用Internet Explorer 增强的安全配置
  2. linux+cp+吃内存怎么办,Linux吃掉了我的内存
  3. OpenGL多维数据集的透视图渲染
  4. linux mysql io压力大_MySQL 调优基础(四) Linux 磁盘IO_MySQL
  5. c语言第一章考试题及答案,C语言考试题库及答案整理版.doc
  6. 万字教你如何用 Python 实现线性规划
  7. 华为Mate 40 Pro钢化膜上手:6.6寸大曲率瀑布屏 黑边加速消失
  8. Android Fragment之间的切换
  9. 免费杀软中的王者:德国小红伞评测
  10. 基于StackGAN++、CycleGAN的图像生成工具,开源
  11. excel单元格内容拆分_Excel | 单元格内容换行方法
  12. 云计算和计算机应用的区别,普适计算与云计算的区别
  13. You Dont Know JS 中文版
  14. 全国省份GDP动态统计图表echarts.js插件
  15. 增益自适应PI控制器+死区过滤器(Smart PLC向导PID编程应用)
  16. 每日方法分享:手机怎么录屏?
  17. 交通 流量 时间序列预测,神经网络 机器学习 BPNN
  18. 学习能力 什么是真正的学习
  19. 编译原理 实验2 语法分析器的构造
  20. 如何解决医院网站商务通无轨迹来源路径的问题

热门文章

  1. ELF 动态链接 so的动态符号表(.dynsym)
  2. web程序入门五(http无状态)
  3. python如何优雅判断类型
  4. 《Java技术》第八次作业
  5. Buying Feed, 2010 Nov (单调队列优化DP)
  6. 如何使用 Microsoft Azure Media Services 现场直播,(Live Streaming) 直播流媒体系统
  7. windows和linux的内存管理
  8. oracle t44,SecureFiles LOBs基础知识之存储篇
  9. redis存储数据类型_Redis与Memcahe的区别最全整理
  10. 回来来看初学C语言的一些有趣的图形的输出