【问题标题】:It's possible to connect to "HTTP Long Polling server" as a "client" with .NET WebSockets?可以使用 .NET WebSockets 作为“客户端”连接到“HTTP 长轮询服务器”吗?
【发布时间】:2021-05-24 23:13:55
【问题描述】:

我正在查看 this sample connection 和 socket.io 并且我正在尝试让客户端连接到“https://scorebot-lb.hltv.org”(这不是网络套接字 Api)例如 .NET WebSockets。

示例 Node.js 语法

SampleConn = async () => {

    const url = 'https://scorebot-lb.hltv.org'
    const matchId = 2348837

    const socket = io.connect(url)

    const initObject = JSON.stringify({
        token: '',
        listId: matchId
    })

    let reconnected = false

    socket.on('connect', () => {

        if (!reconnected) {
            socket.emit('readyForMatch', initObject)
        }

        socket.on('scoreboard', (data) => {
            ...
        })

        socket.on('log', (data) => {
            ...
        })

        socket.on('fullLog', (data) => {
            ...
        })
    })

    return "";
};

Node.js 中的这个示例运行良好。但在我的 .NET 默认设置中,套接字配置需要“ws://”或“wss://”网址,如果您尝试输入“https://scorebot-lb.hltv.org”,我们会得到一些错误,例如:

1 - HostNotFound;
2 - System.ArgumentException: 'The scheme part isn't 'ws' or 'wss': https://scorebot-lb.hltv.org';
3 - System.ArgumentException: 'Not an absolute URI: scorebot-lb.hltv.org';

其他测试,但没有成功:

WebSocketSharp

public static void Main(string[] args)
{
     using (var ws = new WebSocketSharp.WebSocket("scorebot-lb.hltv.org"))
     {
          ws.OnMessage += (sender, e) =>
             Console.WriteLine("...");

          ws.Connect();
          ws.Send("...");
          Console.ReadKey(true);
     }
}

SocketIOSharp

class Program
{
    public static void Main(string[] args)
    {
        try
        {
            var options = new SocketIOClientOption(EngineIOScheme.http, "scorebot-lb.hltv.org", 80);
            var client = new SocketIOClient(options);

            client.Connect();

            client.On("connect", () => {

                client.Emit("readyForMatch", "{'token':'','listId':2348837}");

                client.On("scoreboard", () => {});

                client.On("log", () => { });

                client.On("fullLog", () => { });
            });

            Console.WriteLine();

        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

路径是什么?有可能吗?

[更新]

简而言之,不,这是不可能的。在我写这个问题之前,我不知道HLTV计分板使用socket.io(我认为它与HTTP Long Polling有关),所以我们需要一个socket.io客户端库来做这个。请检查我的答案。

【问题讨论】:

  • 当您使用wss 时发生了什么错误?这是 TLS websockets 的正确 URL 方案
  • 我很确定这不是你想的那样。如果您 search the web 为 hltv.org 提供 websocket 服务,则没有任何结果。你能指导我们到 hltv.org 的 Websocket API 吗?也许我不是在寻找正确的东西。你提到的那个 nuget 包只是一个网络爬虫项目。他们可能基于爬虫代码创建了自己的自定义 websocket 服务器。
  • @Andy 是的,没有用于 HLTV 的官方 API 或 Websocket API。 Node.js 库报废匹配页面和“连接到 scorebot”。如果 socket.io 可以做到这一点,为什么 SocketIOSharp(SocketIOSharp 是 Socket.IO 协议修订 4 库)不能?
  • @SamiKuhmonen 你的意思是什么格式? wss://scorebot-lb.hltv.org?
  • @Igor 是的,只需将 https 替换为 wss,然后它就是一个有效的 TLS websockets URL

标签: .net asp.net-core websocket socket.io


【解决方案1】:

我与The unofficial HLTV Node.js API repo 的所有者交谈,他告诉我:

HLTV 使用 socket-io,所以这是不可能的。您需要连接 socket-io 客户端,否则它将无法正常工作。

在这种情况下,我以客户端的身份与SocketIOSharp(问题之前提到过)建立了连接,实现是这样的:

using System; 
using SocketIOSharp.Client; 
using SocketIOSharp.Common; 
using EngineIOSharp.Common.Enum;
    
    class Program {
        static void Main(string[] args)
        {
            var socketIOClient = 
                new SocketIOClient(new SocketIOClientOption(EngineIOScheme.http, "scorebot-lb.hltv.org", 80));
    
            InitEventHandlers(socketIOClient);            
    
            socketIOClient.Connect();
          
            Console.Read();
        }
    
        static void InitEventHandlers(SocketIOClient socketIOClient)
        {
            socketIOClient.On(SocketIOEvent.CONNECTION, () =>
            {
                Console.WriteLine("Connected!");
                socketIOClient.Emit("readyForMatch", "{'token':'','listId':2348897}");
            });
    
            socketIOClient.On(SocketIOEvent.DISCONNECT, () =>
            {
                Console.WriteLine("Disconnected!");
            });
    
            //Sample event...
            socketIOClient.On("scoreboard", (Data) =>
            {
                Console.WriteLine(Data[0]);
            });
        } }

有了这个实现,现在一切正常 ?‍?✔️!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2015-03-21
    • 2012-10-09
    • 1970-01-01
    • 2011-05-15
    • 2020-06-26
    相关资源
    最近更新 更多