c# 实现WebSocket
<div class="postcontent"><div id="cnblogs_post_body">用C# ASP.NET MVC 实现WebSocket ,对于WebSocket想必都很了解了,不多说.东西做的很粗糙 只能实现基本的聊天功能,不过基本的通信实现了,那么后序的扩展应该也不难(个人这么认为...)
先看下效果
http://pic002.cnblogs.com/images/2012/314704/2012102018241064.png
可同时支持群聊和私聊 源码下载地址
http://download.csdn.net/detail/formularz/4668280
首先介绍下ValueWebSocket.cs 这个文件 主要是对与客户端的通信进行集中控制
1.ValueServer: Socket服务端
2.ValueProtocol:对WebSocket通信的数据加以解析
3.SessionManager: 集中管理在线用户
<div class="cnblogs_code" >http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttp://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifValueWebSocket.cs<div id="cnblogs_code_open_c8636663-d42a-44a4-9567-91633139f423" class="cnblogs_code_hide">1public class ValueWebSocket2 {3 // WebSocket服务端4 private ValueServer server;5 // 解析协议6 private ValueProtocol valueProtocol;7 // 管理在线用户8 private SessionManager sessionManager;9 10 public ValueWebSocket(String ipAddress, Int32 port) 11 { 12 valueProtocol = new ValueProtocol(); 13 sessionManager = new SessionManager(); 14 15 server = new ValueServer(ipAddress, port, Encoding.UTF8); 16 server.OnReceive += new ValueHelper.ValueSocket.Infrastructure.ReceiveHandler(server_OnReceive); 17 } 18 19 private void server_OnReceive(ValueHelper.ValueSocket.SocketEvents.ReceiveEventArgs e) 20 { 21 // 分析用户是否已存在 22 if (sessionManager.CheckSessionExist(e.Socket)) 23 { 24 Message message = valueProtocol.Decode(e.Data); 25 if (message.header.Opcode == OperType.Close) 26 { 27 removeUser(e.Socket); 28 } 29 if (message.header.Opcode == OperType.Text) 30 { 31 String msg = message.Data.ToString(); 32 execMsg(e.Socket, msg); 33 } 34 } 35 else 36 { 37 // 用户不存在则添加用户 38 // 并发送握手信息与客户端建立连接 39 String request = Encoding.UTF8.GetString(e.Data); 40 Byte[] response = valueProtocol.GetResponse(request); 41 server.Send(e.Socket, response); 42 sessionManager.AddSession(e.Socket, request); 43 } 44 } 45 46 // 对消息进行的处理 47 private void execMsg(Socket socket, String message) 48 { 49 String name = String.Empty; 50 foreach (ValueSession session in SessionManager.Sessions) 51 { 52 Socket sk = session.Socket; 53 if (sk.Connected) 54 { 55 if (sk.RemoteEndPoint == socket.RemoteEndPoint) 56 { 57 name = session.Cookies["name"]; 58 break; 59 } 60 } 61 } 62 63 // 判断私聊还是公共 64 String[] separator = message.Split(new String[] { "<separator>" }, StringSplitOptions.None); 65 String msg = String.Concat(name, ": ", separator[1]); 66 if (separator[0] == "All") 67 SendToAll(msg); 68 else 69 { 70 foreach (ValueSession session in SessionManager.Sessions) 71 { 72 if (session.Cookies["name"] == separator[0]) 73 { 74 sendTo(session.Socket, msg); 75 break; 76 } 77 } 78 } 79 } 80 81 private void removeUser(Socket socket) 82 { 83 sessionManager.RemoveSession(socket); 84 } 85 86 private void SendToAll(String msg) 87 { 88 foreach (ValueSession session in SessionManager.Sessions) 89 { 90 sendTo(session.Socket, msg); 91 } 92 } 93 94 private Boolean sendTo(Socket socket, String msg) 95 { 96 Byte[] data = valueProtocol.Encode(msg); 97 return server.Send(socket, data); 98 } 99 100 public void Start()101 {102 server.Start();103 }104 105 public void Dispose()106 {107 sessionManager.Dispose();108 server.Dispose();109 }110 }
页:
[1]