湖南网站建设 要上磐石网络,大型销售网站建设,铜陵专业网站制作公司,高质量的赣州网站建设websocket-sharp 是一个websocket的C#实现#xff0c;支持.net 3.5及以上来开发服务端或者客户端。本文主要介绍用websocket-sharp来做服务端、JavaScript做客户端来实现一个简单的IM。
WebSocketBehavior
WebSocketBehavior是核心对象#xff0c;他包含了OnOpen,OnMessage…websocket-sharp 是一个websocket的C#实现支持.net 3.5及以上来开发服务端或者客户端。本文主要介绍用websocket-sharp来做服务端、JavaScript做客户端来实现一个简单的IM。
WebSocketBehavior
WebSocketBehavior是核心对象他包含了OnOpen,OnMessageOnClose,OnError四个事件回调以及一个Sessions对象和一个Send方法。熟悉websocket的都知道前四个事件回调函数是用来处理客户端链接、发送消息、链接关闭以及出错。sessions则是用来管理所有的会话连接。每产生一个连接都会有一个新Idsessions中会新增一个IWebSocketSession对象。当页面关闭或者刷新都会触发OnClose继而sessions中会移除对应的IwebSocketSession对象。 WebSocketSessionManager 有一个广播方法Sessions.Broadcast通知所有连接的客户端。而WebSocketBehavior中的Send相当于是单发只能将消息发送到此刻连接的一个客户端。摸清了以上这些我们就可以做一个简单的IM了。
Websoket.Server
新建一个C#控制台程序。现在Nugget中添加websocket-sharp.以及JSON。 然后新增一个Chat类继承WebSocketBehaviorChat相当于是一个websocket的服务你可以创建多个websocketBehavior的实例然后在挂载在websocketServer上。 public class Chat : WebSocketBehavior{private Dictionarystring,string nameListnew Dictionarystring, string();protected override async Task OnMessage(MessageEventArgs e){StreamReader reader new StreamReader(e.Data);string text reader.ReadToEnd();try{var obj Json.JsonParser.DeserializeJsonDto(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.AddWebSocketServiceChat(/Chat);wssv.Start();Console.ReadKey(true);wssv.Stop();}} Client
html: div idmessages/divinput typetext idcontent value/button idsendbt发送/buttondiv昵称input typetext idnickName / button idchangebt修改/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 dataJSON.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-sharphttp://sta.github.io/websocket-sharp/
nodejs 实现websocket服务端http://www.cnblogs.com/stoneniqiu/p/5402311.html