【转】基于WebSocketSharp 的IM 简单实现
websocket-sharp?是一個(gè)websocket的C#實(shí)現(xiàn),支持.net 3.5及以上來(lái)開(kāi)發(fā)服務(wù)端或者客戶(hù)端。本文主要介紹用websocket-sharp來(lái)做服務(wù)端、JavaScript做客戶(hù)端來(lái)實(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ù))是用來(lái)處理客戶(hù)端鏈接、發(fā)送消息、鏈接關(guān)閉以及出錯(cuò)。sessions則是用來(lái)管理所有的會(huì)話(huà)連接。每產(chǎn)生一個(gè)連接,都會(huì)有一個(gè)新Id,sessions中會(huì)新增一個(gè)IWebSocketSession對(duì)象。當(dāng)頁(yè)面關(guān)閉或者刷新都會(huì)觸發(fā)OnClose,繼而sessions中會(huì)移除對(duì)應(yīng)的IwebSocketSession對(duì)象。
WebSocketSessionManager 有一個(gè)廣播方法:Sessions.Broadcast,通知所有連接的客戶(hù)端。而WebSocketBehavior中的Send相當(dāng)于是單發(fā),只能將消息發(fā)送到此刻連接的一個(gè)客戶(hù)端。摸清了以上這些我們就可以做一個(gè)簡(jiǎn)單的IM了。
Websoket.Server
新建一個(gè)C#控制臺(tái)程序。現(xiàn)在Nugget中添加websocket-sharp.以及JSON。
然后新增一個(gè)Chat類(lèi),繼承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 + " 類(lèi)型:" + obj.type + " id:" + Id);switch (obj.type){//正常聊天case "1":obj.name = nameList[Id];await Sessions.Broadcast(Json.JsonParser.Serialize(obj));break;//修改名稱(chēng)case "2":Console.WriteLine("{0}修改名稱(chēng){1}",nameList[Id],obj.content);Broadcast(string.Format("{0}修改名稱(chēng){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}下線(xiàn),共有{1}人在線(xiàn)", 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}上線(xiàn)了,共有{1}人在線(xiàn)", 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來(lái)管理所有的鏈接Id和用戶(hù)名稱(chēng)的對(duì)應(yīng)關(guān)系,新上線(xiàn)的人都默認(rèn)為游客。然后再OnMessage中定義了三種消息類(lèi)型。1表示正常聊天,2表示修改名稱(chēng)。3表示系統(tǒng)通知。用來(lái)讓前端做一些界面上的區(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>昵稱(chēng):<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");// 斷線(xiàn)重連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("修改名稱(chēng)"+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)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 定义“北京时间” 中科院研发新一代光钟:
- 下一篇: 三星彻底放弃LCD电视:300名相关员工