【转】基于WebSocketSharp 的IM 简单实现
websocket-sharp?是一個(gè)websocket的C#實(shí)現(xiàn),支持.net 3.5及以上來開發(fā)服務(wù)端或者客戶端。本文主要介紹用websocket-sharp來做服務(wù)端、JavaScript做客戶端來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的IM。
WebSocketBehavior
WebSocketBehavior是核心對(duì)象,他包含了OnOpen,OnMessage,OnClose,OnError四個(gè)事件(回調(diào))以及一個(gè)Sessions對(duì)象和一個(gè)Send方法。熟悉websocket的都知道前四個(gè)事件(回調(diào)函數(shù))是用來處理客戶端鏈接、發(fā)送消息、鏈接關(guān)閉以及出錯(cuò)。sessions則是用來管理所有的會(huì)話連接。每產(chǎn)生一個(gè)連接,都會(huì)有一個(gè)新Id,sessions中會(huì)新增一個(gè)IWebSocketSession對(duì)象。當(dāng)頁面關(guān)閉或者刷新都會(huì)觸發(fā)OnClose,繼而sessions中會(huì)移除對(duì)應(yīng)的IwebSocketSession對(duì)象。
WebSocketSessionManager 有一個(gè)廣播方法:Sessions.Broadcast,通知所有連接的客戶端。而WebSocketBehavior中的Send相當(dāng)于是單發(fā),只能將消息發(fā)送到此刻連接的一個(gè)客戶端。摸清了以上這些我們就可以做一個(gè)簡(jiǎn)單的IM了。
Websoket.Server
新建一個(gè)C#控制臺(tái)程序。現(xiàn)在Nugget中添加websocket-sharp.以及JSON。
然后新增一個(gè)Chat類,繼承WebSocketBehavior,Chat相當(dāng)于是一個(gè)websocket的服務(wù),你可以創(chuàng)建多個(gè)websocketBehavior的實(shí)例然后在掛載在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("連接關(guān)閉" + 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和用戶名稱的對(duì)應(yīng)關(guān)系,新上線的人都默認(rèn)為游客。然后再OnMessage中定義了三種消息類型。1表示正常聊天,2表示修改名稱。3表示系統(tǒng)通知。用來讓前端做一些界面上的區(qū)分。
然后在Program中啟動(dòng)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">發(fā)送</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")})?
運(yùn)行效果:
是不是很方便~~,喜歡就贊一個(gè)。
源碼:https://files.cnblogs.com/files/stoneniqiu/websocket-sharp.zip
websocket-sharp:http://sta.github.io/websocket-sharp/
nodejs 實(shí)現(xiàn)websocket服務(wù)端:http://www.cnblogs.com/stoneniqiu/p/5402311.html?
總結(jié)
以上是生活随笔為你收集整理的【转】基于WebSocketSharp 的IM 简单实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定义“北京时间” 中科院研发新一代光钟:
- 下一篇: 【转】ABP源码分析一:整体项目结构及目