您现在的位置是:首页 >技术杂谈 >C# WebSocket 客户端 使用 TouchSocket WebSocketClient网站首页技术杂谈
C# WebSocket 客户端 使用 TouchSocket WebSocketClient
由于涉及到连接某音的弹幕数据,所以需要WebSocket,百度了一圈,有C#原生的WebSocket,看了看,看不懂,无奈换一个,TouchSocket来到了我的面前,网上对于这个插件的评价较高,所以使用之。结果,一堆问题之。唉。抄袭这么难吗?
如果由TouchSocket开发服务端,并且用TouchSocket客户端链接,这样内部使用是没有问题的,B站上也有一大堆视频,问题是,如果我想连接到别人的地址怎么办,尤其是涉及到Cookie和Head参数设置时,问题就来了。
折腾了两天,各种百度都没什么有用的文章,这一点确实比Python差的太多了。所以直接干源码吧,毕竟开源的有这个优势。git clone下来以后运行一下试试吧,结果源码也不支持,难道要干源码,Debug调试了一下流程。终于找到了一些位置是有问题的。
WebSocketClient myWSClient = new WebSocketClient();
myWSClient.Setup(new TouchSocketConfig()
.SetRemoteIPHost(new IPHost("wss://127.0.0.1:7789/ws"))
.SetClientSslOption(
new ClientSslOption()
{
ClientCertificates = new X509CertificateCollection() { new X509Certificate2("RRQMSocket.pfx", "RRQMSocket") },
SslProtocols = SslProtocols.Tls12,
TargetHost = "127.0.0.1",
CertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; }
}))
.Connect();
Console.WriteLine("连接成功");
这是官方的代码,查了所有文档和代码,没有能设置Cookie和Header的地方。这些对于别人家的是需要验证的参数。
但是应该有相关设置的地方吧,仔细找找,找到了这里
public static HttpRequest GetWSRequest(string host, string url, string version, out string base64Key)
{
HttpRequest request = new HttpRequest
{
Method = "GET",
Protocols = "HTTP",
ProtocolVersion = "1.1"
};
request.SetUrl(url);
request.SetHeader(HttpHeaders.Host, host);
request.SetHeader(HttpHeaders.Pragma, "no-cache");
request.SetHeader(HttpHeaders.UserAgent, "TouchSocket.Http.WebSockets");
request.SetHeader(HttpHeaders.Origin, "RRQM");
request.SetHeader(HttpHeaders.AcceptEncoding, "deflate, br");
request.SetHeaderByKey("Connection", "upgrade");
request.SetHeaderByKey("Upgrade", "websocket");
request.SetHeaderByKey("Sec-WebSocket-Version", $"{version}");
base64Key = CreateBase64Key();
request.SetHeaderByKey("Sec-WebSocket-Key", base64Key);
return request;
}
看到这个代码,郁闷郁闷,Origin居然是RRQM 谁家会这么写,UserAgent也是乱写,AcceptEncoding不支持gzip。无语了。
重点
这里是可以设置Header和Cookie的,直接改写这里就可以了
比如需要传 Cookie 可以多写一行 request.SetHeader("Cookie", "你的Cookie值");
把不对的都改成自己需要的就可以了。这样是不是就完事了,感觉不是那么友好,如果支持SetHeader(KeyValue对数据)是不是更灵活
Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add("cookie", "");
headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36");
headers.Add("Origin", "https://lxxxxx.com");
headers.Add("AcceptEncoding", "gzip, deflate, br");
WebSocketClient myWSClient = new WebSocketClient();
myWSClient.Setup(new TouchSocketConfig()
.SetHeaders(headers) //重点
.SetRemoteIPHost(new IPHost("wss://127.0.0.1:7789/ws"))
.SetClientSslOption(
new ClientSslOption()
{
ClientCertificates = new X509CertificateCollection() { new X509Certificate2("RRQMSocket.pfx", "RRQMSocket") },
SslProtocols = SslProtocols.Tls12,
TargetHost = "127.0.0.1",
CertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; }
}))
.Connect();
Console.WriteLine("连接成功");
修改好的代码提供下载包,也可以找我要源码
https://download.csdn.net/download/hanlinhe111/87712840
联系我:QQ1580007242