webSocket浏览器握手不成功(解决)

WebSocket连接出现握手失败的问题,本文提供了解决方案。首先,服务端在接收到请求时需要正确响应。然后,注意报文格式,避免服务器向客户端发送消息时断开连接。参考相关文献和资源,实现顺利的双向通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 websocket与服务端握手会报握手不成功的错误解决方法:

首先是服务端首次收到请求要回报给客户端的报文要做处理多的不说,方法敬上:

 1  /// <summary>
 2         /// 打包请求连接数据
 3         /// </summary>
 4         /// <param name="handShakeBytes"></param>
 5         /// <param name="length"></param>
 6         /// <returns></returns>
 7         private byte[] PackageHandShakeData(byte[] handShakeBytes, int length)
 8         {
 9             string handShakeText = Encoding.UTF8.GetString(handShakeBytes, 0, length);
10             string key = string.Empty;
11             Regex reg = new Regex(@"Sec\-WebSocket\-Key:(.*?)\r\n");
12             Match m = reg.Match(handShakeText);
13             if (m.Value != "")
14             {
15                 key = Regex.Replace(m.Value, @"Sec\-WebSocket\-Key:(.*?)\r\n", "$1").Trim();
16             }
17             byte[] secKeyBytes = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
18             string secKey = Convert.ToBase64String(secKeyBytes);
19             var responseBuilder = new StringBuilder();
20             responseBuilder.Append("HTTP/1.1 101 Switching Protocols" + "\r\n");
21             responseBuilder.Append("Upgrade: websocket" + "\r\n");
22             responseBuilder.Append("Connection: Upgrade" + "\r\n");
23             responseBuilder.Append("Sec-WebSocket-Accept: " + secKey + "\r\n\r\n");
24             return Encoding.UTF8.GetBytes(responseBuilder.ToString());
25         }

当连接成功,你会发现客户端可以随意给服务器发送消息,但是服务器给客户端发送消息还是会断开连接这是因为报文的问题:

 1  /// <summary>
 2         /// 把发送给客户端消息打包处理
 3         /// </summary>
 4         /// <returns></returns>
 5         /// <param name="message">Message.</param>
 6         private byte[] SendMsg(string msg)
 7         {
 8             byte[] content = null;
 9             byte[] temp = Encoding.UTF8.GetBytes(msg);
10             if (temp.Length < 126)
11             {
12                 content = new byte[temp.Length + 2];
13                 content[0] = 0x81;
14                 content[1] = (byte)temp.Length;
15                 Buffer.BlockCopy(temp, 0, content, 2, temp.Length);
16             }
17             else if (temp.Length < 0xFFFF)
18             {
19                 content = new byte[temp.Length + 4];
20                 content[0] = 0x81;
21                 content[1] = 126;
22                 content[2] = (byte)(temp.Length & 0xFF);
23                 content[3] = (byte)(temp.Length >> 8 & 0xFF);
24                 Buffer.BlockCopy(temp, 0, content, 4, temp.Length);
25             }
26             return content;
27         }

完成之后就可以畅游通讯了!!

再次声明参考文献:http://www.cnblogs.com/smark/archive/2012/11/26/2789812.html

转载于:https://www.cnblogs.com/yanbigfeg/p/7347072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值