您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

WebSocketSharp的IM实现

2024/5/10 4:37:47发布29次查看
这次给大家带来websocketsharp的im实现,websocketsharp的im实现注意事项有哪些,下面就是实战案例,一起来看一下。
websocket-sharp 是一个websocket的c#实现,支持.net 3.5及以上来开发服务端或者客户端。本文主要介绍用websocket-sharp来做服务端、javascript做客户端来实现一个简单的im。
websocketbehaviorwebsocketbehavior是核心对象,他包含了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();         }     }
clienthtml:
<p id="messages">     </p>    <input type="text" id="content" value=""/>    <button id="sendbt">发送</button>    <p>昵称:<input type="text" id="nickname" /> <button id="changebt">修改</button> </p>
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 p=$(<p>);            var data=json.parse(e.data);            switch(data.type){                case 1:              p.html(data.name+:+data.content);            break;                case 2:                 p.addclass(gray);                 p.html(修改名称+data.content)                break;                case 3:                 p.addclass(gray);                 p.html(data.content)                break;             }             $(#messages).append(p);         }     }          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)     })
运行效果:
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
怎样让js暂停执行
jquery做出评分系统
以上就是websocketsharp的im实现的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product