zformular 发表于 2012-12-19 21:02:32

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]
查看完整版本: c# 实现WebSocket