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实现的详细内容。
