[转载]实战 HTML5 WebSocket 聊天室.net实现 – 大月&小年 – 博客园.
WebSocket protocol 是HTML5一种新的协议(protocol)。目前紧测试了三个浏览器支持(Chrome,Firefox4,Safari)
客户端:
var ws = new WebSocket(con);
//与服务器握手成功
ws.onopen = onOpen;
//接收到服务器消息
ws.onmessage = onMessage;
//断开连接消息
ws.onclose = onClose;
//通读错误
ws.onerror = onError;
进入代码正题服务端
<span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Collections</span><span class = "pun" >.</span><span class = "typ" >Generic</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Text</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Net</span><span class = "pun" >.</span><span class = "typ" >Sockets</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Net</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Threading</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > namespace </span><span class = "pln" > </span><span class = "typ" >DotNetWebSocket</span><span class = "pun" >.</span><span class = "typ" >Engine</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //广播事件</span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > delegate </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >BroadcastEvent</span><span class = "pun" >(</span><span class = "typ" >MessageEntity</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >WebSocketServer</span><span class = "pun" >:</span><span class = "typ" >IDisposable</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Socket</span><span class = "pln" > serverListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //回调,用于消息传给上层应用</span><span class="pln"> </span><span class = "typ" >ICallback</span><span class = "pln" > callback </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //广播事件</span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >BroadcastEvent</span><span class = "pln" > </span><span class = "typ" >BroadcastMessage</span><span class = "pun" >=</span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //客户端连接列表</span><span class="pln"> </span><span class = "typ" >List</span><span class = "pun" ><</span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >></span><span class = "pln" > listConnection </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pun" ><</span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >>();</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >WebSocketServer</span><span class = "pun" >(</span><span class = "typ" >ICallback</span><span class = "pln" > callback</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >callback </span><span class = "pun" >=</span><span class = "pln" > callback</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 启动等待连接</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >StartConnection</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > serverListener </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Socket</span><span class = "pun" >(</span><span class = "typ" >AddressFamily</span><span class = "pun" >.</span><span class = "typ" >InterNetwork</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >SocketType</span><span class = "pun" >.</span><span class = "typ" >Stream</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ProtocolType</span><span class = "pun" >.</span><span class = "pln" >IP</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > // Start the socket</span><span class="pln"> </span><span class = "kwd" > string </span><span class = "pun" >[]</span><span class = "pln" > ip </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >ServerId</span><span class = "pun" >.</span><span class = "typ" >Split</span><span class = "pun" >(</span><span class = "str" > '.' </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >IPAddress</span><span class = "pln" > localIp </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >IPAddress</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Convert</span><span class = "pun" >.</span><span class = "typ" >ToByte</span><span class = "pun" >(</span><span class = "pln" >ip</span><span class = "pun" >[</span><span class = "lit" >0</span><span class = "pun" >]),</span><span class = "pln" > </span><span class = "typ" >Convert</span><span class = "pun" >.</span><span class = "typ" >ToByte</span><span class = "pun" >(</span><span class = "pln" >ip</span><span class = "pun" >[</span><span class = "lit" >1</span><span class = "pun" >]),</span><span class = "pln" > </span><span class = "typ" >Convert</span><span class = "pun" >.</span><span class = "typ" >ToByte</span><span class = "pun" >(</span><span class = "pln" >ip</span><span class = "pun" >[</span><span class = "lit" >2</span><span class = "pun" >]),</span><span class = "typ" >Convert</span><span class = "pun" >.</span><span class = "typ" >ToByte</span><span class = "pun" >(</span><span class = "pln" >ip</span><span class = "pun" >[</span><span class = "lit" >3</span><span class = "pun" >])</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > serverListener</span><span class = "pun" >.</span><span class = "typ" >Bind</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >IPEndPoint</span><span class = "pun" >(</span><span class = "pln" >localIp</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >ServerPort</span><span class = "pun" >));</span><span class = "pln" > serverListener</span><span class = "pun" >.</span><span class = "typ" >Listen</span><span class = "pun" >(</span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >ConnectionsCount</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > while </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > true </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //等待客户端请求</span><span class="pln"> </span><span class = "typ" >Socket</span><span class = "pln" > sc </span><span class = "pun" >=</span><span class = "pln" > serverListener</span><span class = "pun" >.</span><span class = "typ" >Accept</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >sc </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Thread</span><span class = "pun" >.</span><span class = "typ" >Sleep</span><span class = "pun" >(</span><span class = "lit" >100</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pln" > ci </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >();</span><span class = "pln" > ci</span><span class = "pun" >.</span><span class = "typ" >ClientSocket</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > sc</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //初始化三个事件</span><span class="pln"> ci</span><span class = "pun" >.</span><span class = "typ" >NewUserConnection</span><span class = "pln" > </span><span class = "pun" >+=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pun" >(</span><span class = "typ" >Ci_NewUserConnection</span><span class = "pun" >);</span><span class = "pln" > ci</span><span class = "pun" >.</span><span class = "typ" >ReceiveData</span><span class = "pln" > </span><span class = "pun" >+=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pun" >(</span><span class = "typ" >Ci_ReceiveData</span><span class = "pun" >);</span><span class = "pln" > ci</span><span class = "pun" >.</span><span class = "typ" >DisConnection</span><span class = "pln" > </span><span class = "pun" >+=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pun" >(</span><span class = "typ" >Ci_DisConnection</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //开始与客户端握手[握手成功,即可通讯了]</span><span class="pln"> ci</span><span class = "pun" >.</span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >BeginReceive</span><span class = "pun" >(</span><span class = "pln" >ci</span><span class = "pun" >.</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > ci</span><span class = "pun" >.</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >AsyncCallback</span><span class = "pun" >(</span><span class = "pln" >ci</span><span class = "pun" >.</span><span class = "typ" >StartHandshake</span><span class = "pun" >),</span><span class = "pln" > ci</span><span class = "pun" >.</span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >Available</span><span class = "pun" >);</span><span class = "pln" > listConnection</span><span class = "pun" >.</span><span class = "typ" >Add</span><span class = "pun" >(</span><span class = "pln" >ci</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 断开服务端Socket</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="sender"></param></span><span class="pln"> </span><span class = "com" > /// <param name="me"></param></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >Ci_DisConnection</span><span class = "pun" >(</span><span class = "kwd" > object </span><span class = "pln" > sender</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >MessageEntity</span><span class = "pln" > me</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > callback</span><span class = "pun" >.</span><span class = "typ" >DisConnection</span><span class = "pun" >(</span><span class = "pln" >sender </span><span class = "kwd" > as </span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >,</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 接收数据</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="sender"></param></span><span class="pln"> </span><span class = "com" > /// <param name="me"></param></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >Ci_ReceiveData</span><span class = "pun" >(</span><span class = "kwd" > object </span><span class = "pln" > sender</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >MessageEntity</span><span class = "pln" > me</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > callback</span><span class = "pun" >.</span><span class = "typ" >Read</span><span class = "pun" >(</span><span class = "pln" >sender </span><span class = "kwd" > as </span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >,</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 握手成功手的连接</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="sender"></param></span><span class="pln"> </span><span class = "com" > /// <param name="me"></param></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >Ci_NewUserConnection</span><span class = "pun" >(</span><span class = "kwd" > object </span><span class = "pln" > sender</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >MessageEntity</span><span class = "pln" > me</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pln" > ci</span><span class = "pun" >=</span><span class = "pln" >sender </span><span class = "kwd" > as </span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >BroadcastMessage</span><span class = "pln" > </span><span class = "pun" >+=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >BroadcastEvent</span><span class = "pun" >(</span><span class = "pln" >ci</span><span class = "pun" >.</span><span class = "typ" >SendMessage</span><span class = "pun" >);</span><span class = "pln" > callback</span><span class = "pun" >.</span><span class = "typ" >NewUserConnectionJoin</span><span class = "pun" >(</span><span class = "pln" >ci</span><span class = "pun" >,</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" >#region IDisposable 成员</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >Dispose</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > serverListener </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" >#endregion</span><span class = "pln" > </span><span class = "pun" >}</span> |
<span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Collections</span><span class = "pun" >.</span><span class = "typ" >Generic</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Text</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Net</span><span class = "pun" >.</span><span class = "typ" >Sockets</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >Newtonsoft</span><span class = "pun" >.</span><span class = "typ" >Json</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > using </span><span class = "pln" > </span><span class = "typ" >DotNetWebSocket</span><span class = "pun" >.</span><span class = "typ" >Engine</span><span class = "pun" >.</span><span class = "typ" >Message</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > namespace </span><span class = "pln" > </span><span class = "typ" >DotNetWebSocket</span><span class = "pun" >.</span><span class = "typ" >Engine</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > delegate </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pun" >(</span><span class = "kwd" > object </span><span class = "pln" > sender</span><span class = "pun" >,</span><span class = "typ" >MessageEntity</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "typ" >ServerKey1</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "typ" >ServerKey2</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > name</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > get </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > name</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > set </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > name </span><span class = "pun" >=</span><span class = "pln" > value</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Socket</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > receivedDataBuffer</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > event </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pln" > </span><span class = "typ" >NewUserConnection</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > event </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pln" > </span><span class = "typ" >ReceiveData</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > event </span><span class = "pln" > </span><span class = "typ" >ClientSocketEvent</span><span class = "pln" > </span><span class = "typ" >DisConnection</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >ClientSocketInstance</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > receivedDataBuffer </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[</span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >MaxBufferSize</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "typ" >ServerKey1</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[</span><span class = "lit" >4</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "typ" >ServerKey2</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[</span><span class = "lit" >4</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 接收数据</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="result"></param></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >Read</span><span class = "pun" >(</span><span class = "typ" >IAsyncResult</span><span class = "pln" > result</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(!</span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >Connected</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > try </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > // Web Socket protocol: 0x00开头,0xFF结尾</span><span class="pln"> </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Text</span><span class = "pun" >.</span><span class = "pln" >UTF8Encoding decoder </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Text</span><span class = "pun" >.</span><span class = "pln" >UTF8Encoding</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > startIndex </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > endIndex </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //查找起启位置</span><span class="pln"> </span><span class = "kwd" > while </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >[</span><span class = "pln" >startIndex</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "lit" >0x00</span><span class = "pun" >)</span><span class = "pln" > startIndex</span><span class = "pun" >++;</span><span class = "pln" > </span><span class = "com" > // 查找结束位置</span><span class="pln"> endIndex </span><span class = "pun" >=</span><span class = "pln" > startIndex </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "lit" >1</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > while </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >[</span><span class = "pln" >endIndex</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "lit" >0xff</span><span class = "pln" > </span><span class = "pun" >&&</span><span class = "pln" > endIndex </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >MaxBufferSize</span><span class = "pln" > </span><span class = "pun" >-</span><span class = "pln" > </span><span class = "lit" >1</span><span class = "pun" >)</span><span class = "pln" > endIndex</span><span class = "pun" >++;</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >endIndex </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >MaxBufferSize</span><span class = "pln" > </span><span class = "pun" >-</span><span class = "pln" > </span><span class = "lit" >1</span><span class = "pun" >)</span><span class = "pln" > endIndex </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >MaxBufferSize</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > messageReceived </span><span class = "pun" >=</span><span class = "pln" > decoder</span><span class = "pun" >.</span><span class = "typ" >GetString</span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > startIndex</span><span class = "pun" >,</span><span class = "pln" > endIndex </span><span class = "pun" >-</span><span class = "pln" > startIndex</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >MessageEntity</span><span class = "pln" > me </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >JsonConvert</span><span class = "pun" >.</span><span class = "typ" >DeserializeObject</span><span class = "pun" >(</span><span class = "pln" >messageReceived</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > typeof </span><span class = "pun" >(</span><span class = "typ" >MessageEntity</span><span class = "pun" >))</span><span class = "pln" > </span><span class = "kwd" > as </span><span class = "pln" > </span><span class = "typ" >MessageEntity</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(!</span><span class = "kwd" > string </span><span class = "pun" >.</span><span class = "typ" >IsNullOrEmpty</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "typ" >Name</span><span class = "pun" >))</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ReceiveData</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > else </span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >me</span><span class = "pun" >.</span><span class = "typ" >MessageId</span><span class = "pun" >.</span><span class = "typ" >ToLower</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "str" > "login" </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >NewUserConnection</span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "typ" >Name</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >Newtonsoft</span><span class = "pun" >.</span><span class = "typ" >Json</span><span class = "pun" >.</span><span class = "typ" >JsonConvert</span><span class = "pun" >.</span><span class = "typ" >DeserializeObject</span><span class = "pun" >(</span><span class = "pln" >me</span><span class = "pun" >.</span><span class = "typ" >MessageContent</span><span class = "pun" >,</span><span class = "kwd" > typeof </span><span class = "pun" >(</span><span class = "typ" >ChartMessage</span><span class = "pun" >))</span><span class = "pln" > </span><span class = "kwd" > as </span><span class = "pln" > </span><span class = "typ" >ChartMessage</span><span class = "pun" >).</span><span class = "typ" >Message</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >NewUserConnection</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > me</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /* MessageEntity me=new MessageEntity(); me.MessageContent = messageReceived; ReceiveData(this, me);*/ </span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Clear</span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > receivedDataBuffer</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >BeginReceive</span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > receivedDataBuffer</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >AsyncCallback</span><span class = "pun" >(</span><span class = "typ" >Read</span><span class = "pun" >),</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > catch </span><span class = "pun" >(</span><span class = "typ" >Exception</span><span class = "pln" > ex</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >DisConnection</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 发送与客户端握手信息</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="status"></param></span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >StartHandshake</span><span class = "pun" >(</span><span class = "typ" >IAsyncResult</span><span class = "pln" > status</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > </span><span class = "typ" >ClientHandshakeLength</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pun" >)</span><span class = "pln" > status</span><span class = "pun" >.</span><span class = "typ" >AsyncState</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > last8Bytes </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[</span><span class = "lit" >8</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Copy</span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ClientHandshakeLength</span><span class = "pln" > </span><span class = "pun" >-</span><span class = "pln" > </span><span class = "lit" >8</span><span class = "pun" >,</span><span class = "pln" > last8Bytes</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >8</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >ASCIIEncoding</span><span class = "pln" > decoder </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Text</span><span class = "pun" >.</span><span class = "typ" >ASCIIEncoding</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >ClientHandshake</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > decoder</span><span class = "pun" >.</span><span class = "typ" >GetString</span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ClientHandshakeLength</span><span class = "pln" > </span><span class = "pun" >-</span><span class = "pln" > </span><span class = "lit" >8</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "typ" >ClientHandshakeLines</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >ClientHandshake</span><span class = "pun" >.</span><span class = "typ" >Split</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Environment</span><span class = "pun" >.</span><span class = "typ" >NewLine</span><span class = "pln" > </span><span class = "pun" >},</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >StringSplitOptions</span><span class = "pun" >.</span><span class = "typ" >RemoveEmptyEntries</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > /*请求中的Sec-WebSocket-Key1中所有的数字连在一起 * 然后除以空格的个数,得到结果1。 * 然后从Key2同样的得到结果2, * 这两个结果取整后切断为32位整数, * 然后转成大头的网络顺序(Big-Endian), * 这两个结果和请求中最后的8个字节拼在一起, * 然后计算MD5。 这个MD5的16字节结果就是服务器的反馈key*/ </span><span class = "pln" > </span><span class = "com" > //计算16位的服务端Key</span><span class="pln"> </span><span class = "kwd" > foreach </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > string </span><span class = "pln" > </span><span class = "typ" >Line</span><span class = "pln" > </span><span class = "kwd" > in </span><span class = "pln" > </span><span class = "typ" >ClientHandshakeLines</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >Line</span><span class = "pun" >.</span><span class = "typ" >Contains</span><span class = "pun" >(</span><span class = "str" > "Sec-WebSocket-Key1:" </span><span class = "pun" >))</span><span class = "pln" > </span><span class = "typ" >BuildServerSecKey</span><span class = "pun" >(</span><span class = "lit" >1</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Line</span><span class = "pun" >.</span><span class = "typ" >Substring</span><span class = "pun" >(</span><span class = "typ" >Line</span><span class = "pun" >.</span><span class = "typ" >IndexOf</span><span class = "pun" >(</span><span class = "str" > ":" </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "lit" >2</span><span class = "pun" >));</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >Line</span><span class = "pun" >.</span><span class = "typ" >Contains</span><span class = "pun" >(</span><span class = "str" > "Sec-WebSocket-Key2:" </span><span class = "pun" >))</span><span class = "pln" > </span><span class = "typ" >BuildServerSecKey</span><span class = "pun" >(</span><span class = "lit" >2</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Line</span><span class = "pun" >.</span><span class = "typ" >Substring</span><span class = "pun" >(</span><span class = "typ" >Line</span><span class = "pun" >.</span><span class = "typ" >IndexOf</span><span class = "pun" >(</span><span class = "str" > ":" </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "lit" >2</span><span class = "pun" >));</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > //握手头信息</span><span class="pln"> </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "typ" >HandshakeText</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >Encoding</span><span class = "pun" >.</span><span class = "pln" >ASCII</span><span class = "pun" >.</span><span class = "typ" >GetBytes</span><span class = "pun" >(</span><span class = "typ" >WebSocketProtocol</span><span class = "pun" >.</span><span class = "typ" >GetInstance</span><span class = "pun" >.</span><span class = "typ" >ServerHandshake</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > serverHandshakeResponse </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[</span><span class = "typ" >HandshakeText</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "lit" >16</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > serverKey </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >BuildFullServerSecKey</span><span class = "pun" >(</span><span class = "pln" >last8Bytes</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Copy</span><span class = "pun" >(</span><span class = "typ" >HandshakeText</span><span class = "pun" >,</span><span class = "pln" > serverHandshakeResponse</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >HandshakeText</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Copy</span><span class = "pun" >(</span><span class = "pln" >serverKey</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > serverHandshakeResponse</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >HandshakeText</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >16</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >BeginSend</span><span class = "pun" >(</span><span class = "pln" >serverHandshakeResponse</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >HandshakeText</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "lit" >16</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >HandshakeSuccess</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 根据客户端握手Key生成客户端响应给客户端的安全Key</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="keyNum"></param></span><span class="pln"> </span><span class = "com" > /// <param name="clientKey"></param></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >BuildServerSecKey</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > keyNum</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > clientKey</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > string </span><span class = "pln" > partialServerKey </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "str" > "" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > currentKey</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > spacesNum </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > char </span><span class = "pun" >[]</span><span class = "pln" > keyChars </span><span class = "pun" >=</span><span class = "pln" > clientKey</span><span class = "pun" >.</span><span class = "typ" >ToCharArray</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //根据客户端Key获取得其中的空格数及其中的数字</span><span class="pln"> </span><span class = "kwd" > foreach </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > char </span><span class = "pln" > currentChar </span><span class = "kwd" > in </span><span class = "pln" > keyChars</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > char </span><span class = "pun" >.</span><span class = "typ" >IsDigit</span><span class = "pun" >(</span><span class = "pln" >currentChar</span><span class = "pun" >))</span><span class = "pln" > partialServerKey </span><span class = "pun" >+=</span><span class = "pln" > currentChar</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > char </span><span class = "pun" >.</span><span class = "typ" >IsWhiteSpace</span><span class = "pun" >(</span><span class = "pln" >currentChar</span><span class = "pun" >))</span><span class = "pln" > spacesNum</span><span class = "pun" >++;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > try </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //用获取的数字除于空格数,再转成大头网络数据</span><span class="pln"> currentKey </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >BitConverter</span><span class = "pun" >.</span><span class = "typ" >GetBytes</span><span class = "pun" >((</span><span class = "kwd" > int </span><span class = "pun" >)(</span><span class = "typ" >Int64</span><span class = "pun" >.</span><span class = "typ" >Parse</span><span class = "pun" >(</span><span class = "pln" >partialServerKey</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >/</span><span class = "pln" > spacesNum</span><span class = "pun" >));</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >BitConverter</span><span class = "pun" >.</span><span class = "typ" >IsLittleEndian</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Reverse</span><span class = "pun" >(</span><span class = "pln" >currentKey</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >keyNum </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "lit" >1</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "typ" >ServerKey1</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > currentKey</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > else </span><span class = "pln" > </span><span class = "typ" >ServerKey2</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > currentKey</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > catch </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ServerKey1</span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Clear</span><span class = "pun" >(</span><span class = "typ" >ServerKey1</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ServerKey1</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ServerKey2</span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Clear</span><span class = "pun" >(</span><span class = "typ" >ServerKey2</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ServerKey2</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > ///生成完整的16位安全Key[将Key1和Key2加在一起再加客户端握手信息的手八位] MD5后返回</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <returns></returns></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "typ" >BuildFullServerSecKey</span><span class = "pun" >(</span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > last8Bytes</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > concatenatedKeys </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[</span><span class = "lit" >16</span><span class = "pun" >];</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Copy</span><span class = "pun" >(</span><span class = "typ" >ServerKey1</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > concatenatedKeys</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >4</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Copy</span><span class = "pun" >(</span><span class = "typ" >ServerKey2</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > concatenatedKeys</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >4</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >4</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Array</span><span class = "pun" >.</span><span class = "typ" >Copy</span><span class = "pun" >(</span><span class = "pln" >last8Bytes</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > concatenatedKeys</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >8</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >8</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > // MD5 Hash</span><span class="pln"> </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Security</span><span class = "pun" >.</span><span class = "typ" >Cryptography</span><span class = "pun" >.</span><span class = "pln" >MD5 MD5Service </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >System</span><span class = "pun" >.</span><span class = "typ" >Security</span><span class = "pun" >.</span><span class = "typ" >Cryptography</span><span class = "pun" >.</span><span class = "pln" >MD5</span><span class = "pun" >.</span><span class = "typ" >Create</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > MD5Service</span><span class = "pun" >.</span><span class = "typ" >ComputeHash</span><span class = "pun" >(</span><span class = "pln" >concatenatedKeys</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 握手成功,此时客户端与服务端建立接连,可进行通讯</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="result"></param></span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >HandshakeSuccess</span><span class = "pun" >(</span><span class = "typ" >IAsyncResult</span><span class = "pln" > result</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >EndSend</span><span class = "pun" >(</span><span class = "pln" >result</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >BeginReceive</span><span class = "pun" >(</span><span class = "pln" >receivedDataBuffer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > receivedDataBuffer</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >AsyncCallback</span><span class = "pun" >(</span><span class = "typ" >Read</span><span class = "pun" >),</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /// <summary></span><span class="pln"> </span><span class = "com" > /// 发送消息</span><span class="pln"> </span><span class = "com" > /// </summary></span><span class="pln"> </span><span class = "com" > /// <param name="me"></param></span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "typ" >SendMessage</span><span class = "pun" >(</span><span class = "typ" >MessageEntity</span><span class = "pln" > me</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >Send</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "lit" >0x00</span><span class = "pun" >});</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >Send</span><span class = "pun" >(</span><span class = "typ" >Encoding</span><span class = "pun" >.</span><span class = "pln" >UTF8</span><span class = "pun" >.</span><span class = "typ" >GetBytes</span><span class = "pun" >(</span><span class = "typ" >JsonConvert</span><span class = "pun" >.</span><span class = "typ" >SerializeObject</span><span class = "pun" >(</span><span class = "pln" >me</span><span class = "pun" >)));</span><span class = "pln" > </span><span class = "typ" >ClientSocket</span><span class = "pun" >.</span><span class = "typ" >Send</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > byte </span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" >0xff</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |