[转载]实战 HTML5 WebSocket 聊天室.net实现

[转载]实战 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>
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册