您现在的位置是:首页 >技术杂谈 >C# WebSocket 客户端 使用 TouchSocket WebSocketClient网站首页技术杂谈

C# WebSocket 客户端 使用 TouchSocket WebSocketClient

小流氓哥哥 2023-06-12 04:00:02
简介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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。