C#websocket服务无法与safari握手

mengbo2008bj mengbo2008bj 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.IO;
using System.Text.RegularExpressions;

namespace Room
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("服务器启动中...");
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 2000);
Socket socket = new Socket(ipe.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipe);
socket.Listen(60);
Console.WriteLine("服务器启动完毕...");
bool isfirst = true;
bool run = true;
try
{
Socket a = socket.Accept();
while (run)
{
byte[] bytes = new byte[1024];
int bytelength = a.Receive(bytes);
Console.WriteLine("接收完毕。");
#region websocket握手
if (isfirst)
{
string recStr = Encoding.UTF8.GetString(bytes, 0, bytelength);
string[] ss = recStr.Split(Environment.NewLine.ToCharArray());
string k1 = ss[10].Substring(20);
string k2 = ss[12].Substring(20);
byte[] last = new byte[8];
for (int i = 0; i < 8; i++)
{
last[i] = bytes[bytelength - 8 + i];
}
uint key1 = (uint)(long.Parse(FilterNonNumber(k1)) / FilterNonEmpty(k1).Length);
uint key2 = (uint)(long.Parse(FilterNonNumber(k2)) / FilterNonEmpty(k2).Length);
byte[] byteTemp1 = BitConverter.GetBytes(key1);
byte[] byteKey1 = new byte[4];
byte[] byteTemp2 = BitConverter.GetBytes(key2);
byte[] byteKey2 = new byte[4];
for (int i = 0; i < 4; i++)
{
byteKey1[i] = byteTemp1[3 - i];
byteKey2[i] = byteTemp2[3 - i];
}
MemoryStream ms = new MemoryStream();
ms.Write(byteKey1, 0, 4);
ms.Write(byteKey2, 0, 4);
ms.Write(last, 0, 8);
ms.Flush();
byte[] byteMs = ms.ToArray();
ms.Dispose();
MD5 md5 = MD5.Create();
byte[] md = md5.ComputeHash(byteMs);
MemoryStream ms1 = new MemoryStream();
string sendStr = "HTTP/1.1 101 WebSocket Protocol Handshake/r/nUpgrade: WebSocket/r/nConnection: Upgrade/r/nSec-WebSocket-Origin: null/r/nSec-WebSocket-Location: ws://192.168.50.218:2000//r/n/r/n";
byte[] temp = Encoding.UTF8.GetBytes(sendStr);
ms1.Write(temp, 0, temp.Length);
ms1.Write(md, 0, md.Length);
ms1.Flush();
byte[] byteSend = ms1.ToArray();
ms1.Dispose();
a.Send(byteSend, byteSend.Length, 0);
Console.WriteLine("发送完毕。");
isfirst = false;
}
#endregion
else
{
if (bytelength > 2)
{
string recStr = Encoding.UTF8.GetString(bytes, 1, bytelength - 2);
MemoryStream ms2 = new MemoryStream();
string strSend = "发送回去的是中文。";
byte[] byteSend = Encoding.UTF8.GetBytes(strSend);
ms2.WriteByte(0);
ms2.Write(byteSend, 0, byteSend.Length);
ms2.WriteByte(255);
ms2.Flush();
a.Send(ms2.ToArray());
ms2.Dispose();
if (recStr.Equals("exit"))
{
run = false;
Console.WriteLine("用户已退出。");
}
else
{
Console.WriteLine("接收到:" + recStr);
}
}
else
{
run = false;
Console.WriteLine("用户已退出。");
}
}
}
Console.ReadLine();
a.Close();
socket.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
socket.Close();
}
}

public static string FilterNonNumber(string str)
{
if (str == null)
{
return "";
}
char[] c = str.ToCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0, len = c.Length; i < len; i++)
{
if (char.IsNumber(c[i]))
{
sb.Append(c[i]);
}
}
return sb.ToString();
}
public static string FilterNonEmpty(string str)
{
if (str == null)
{
return " ";
}
char[] c = str.ToCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0, len = c.Length; i < len; i++)
{
if (c[i] == ' ')
{
sb.Append(c[i]);
}
}
if (sb.ToString().Length == 0)
{
return " ";
}
else
{
return sb.ToString();
}
}


}
}


不知道为什么76协议的safari握手一直是失败的,那位大拿帮解决下问题
...全文

相关推荐

熊数据集集2983张VOC+YOLO格式.zip

数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:2983 Annotations文件夹中xml文件总计:2983 labels文件夹中txt文件总计:2983 标签种类数:1 标签名称:["bear"] 每个标签的框数(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准): bear 框数 = 3021 总框数:3021 图片清晰度(分辨率:像素):清晰 图片是否增强:否 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注

不会仰游的河马君

vue+springboot_基于Java语言的茶叶销售商城电商系统_176brjo7毕业设计源码数据库.zip

vue+springboot_基于Java语言的茶叶销售商城电商系统_176brjo7毕业设计源码数据库.zip

源码论文专家

43一个强到且很实用的Linux网络管理工具.docx

43一个强到且很实用的Linux网络管理工具

云计算练习生

【计量经济学】基于Oster无工具变量法的内生性处理:遗漏变量偏差敏感性分析与稳健因果效应界估算

内容概要:本文介绍了基于Oster(2019)提出的无工具变量法处理内生性问题的实现方法,核心是通过系数稳定性与拟合优度变化进行敏感性分析,量化遗漏变量偏差的影响,并估计在控制不可观测变量后的稳健因果效应β(beta tilde)。该方法利用两步回归(有无控制变量)之间的系数和R²变化,结合不可观测选择强度参数δ与最大潜在R²(Rmax),外推可能的因果效应边界,从而判断基准结果是否对遗漏变量稳健。文中提供了Stata(psacalc)、R(ooster包)和Python三种主流语言的具体实现代码与操作示例,强调结果依赖于参数设定,需进行敏感性扫描以增强说服力。 适合人群:经济学、管理学、社会学、公共卫生、教育等领域的实证研究者,尤其是正在撰写论文、面临审稿人关于内生性质疑的研究生与青年学者。 使用场景及目标:①在缺乏有效工具变量时,评估OLS回归结果对遗漏变量的敏感性;②生成稳健因果效应的点估计与置信区间,回应审稿人对内生性问题的质疑;③通过δ与Rmax的多值扫描,可视化展示结论稳健性。 阅读建议:此方法属于敏感性分析而非因果识别工具,应与IV、DID、固定效应等方法结合使用;使用者需确保两步回归样本一致,并替换示例中的变量名为实际数据变量,同时务必对关键参数开展敏感性测试,避免过度解读单一结果。

王大师王文峰

园区管理者如何通过数据分析精准培育创新主体?.docx

园区管理者如何通过数据分析精准培育创新主体?

BIZKEEN
评论 6
收藏 已收藏
分享
返回顶部
mengbo2008bj
C# 111,128 成员 642,537 内容