WebSocket服务器

握手协议的客户端数据已经由浏览器代劳了,服务器端需要我们自己来实现,目前市场上开源的实现也比较多如:
  • Kaazing WebSocket Gateway(一个 Java 实现的 WebSocket Server);
  • mod_pywebsocket(一个 Python 实现的 WebSocket Server);
  • Netty(一个 Java 实现的网络框架其中包括了对 WebSocket 的支持);
  • node.js(一个 Server 端的 JavaScript 框架提供了对 WebSocket 的支持);
  • WebSocket4Net(一个.net的服务器端实现);

其实在目前的.net4.5框架中已经实现了WebSocket,不用官方实现,我们自己来写个简单的。服务器端需要根据协议来握手、接收和发送。


握手

首先我们再来回顾下握手协议:

 
 
 
  1. 客户端发到服务器的内容:
  2. GET /chat HTTP/1.1
  3. Host: server.example.com
  4. Upgrade: websocket
  5. Connection: Upgrade
  6. Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
  7. Origin: http://example.com
  8. Sec-WebSocket-Protocol: chat, superchat
  9. Sec-WebSocket-Version: 13
  10.  
  11. 从服务器到客户端的内容:
  12. HTTP/1.1 101 Switching Protocols
  13. Upgrade: websocket
  14. Connection: Upgrade
  15. Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  16. Sec-WebSocket-Protocol: chat
关键是服务器端Sec-WebSocket-Accept,它是根据Sec-WebSocket-Key计算出来的:
  1. 取出Sec-WebSocket-Key,与一个magic string “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” 连接成一个新的key串;
  2. 将新的key串SHA1编码,生成一个由多组两位16进制数构成的加密串;
  3. 把加密串进行base64编码生成最终的key,这个key就是Sec-WebSocket-Key;
实例代码如下:
 
 
 
  1. /// <summary>
  2. /// 生成Sec-WebSocket-Accept
  3. /// </summary>
  4. /// <param name="handShakeText">客户端握手信息</param>
  5. /// <returns>Sec-WebSocket-Accept</returns>
  6. private static string GetSecKeyAccetp(byte[] handShakeBytes,int bytesLength)
  7. {
  8. string handShakeText = Encoding.UTF8.GetString(handShakeBytes, 0, bytesLength);
  9. string key = string.Empty;
  10. Regex r = new Regex(@"Sec\-WebSocket\-Key:(.*?)\r\n"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值