如何在.NET C#中将Web Socket绑定到事件

jxct1oxe  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(129)

我正在为Elgato Stream Deck编写一个插件。Stream Deck使用Web Socket与插件通信。我正在尝试用C#将插件编写为控制台应用程序。"compiled plugin" example provided by Elgato已损坏(this GitHub issue points to one problem,而且似乎还有更多),而且似乎无法运行--所以我一直在深入研究代码,以弄清楚它的意义,并将其翻译为C#而不使用Visual Studio调试。我确实找到了这个,但是(link to code file on GitHub):

void ESDConnectionManager::Run()
{
    try
    {
        // Create the endpoint
        mWebsocket.clear_access_channels(websocketpp::log::alevel::all);
        mWebsocket.clear_error_channels(websocketpp::log::elevel::all);
    
        // Initialize ASIO
        mWebsocket.init_asio();
        
        // Register our message handler
        mWebsocket.set_open_handler(websocketpp::lib::bind(&ESDConnectionManager::OnOpen, this, &mWebsocket, websocketpp::lib::placeholders::_1));
        mWebsocket.set_fail_handler(websocketpp::lib::bind(&ESDConnectionManager::OnFail, this, &mWebsocket, websocketpp::lib::placeholders::_1));
        mWebsocket.set_close_handler(websocketpp::lib::bind(&ESDConnectionManager::OnClose, this, &mWebsocket, websocketpp::lib::placeholders::_1));
        mWebsocket.set_message_handler(websocketpp::lib::bind(&ESDConnectionManager::OnMessage, this, websocketpp::lib::placeholders::_1, websocketpp::lib::placeholders::_2));
    
        websocketpp::lib::error_code ec;
        std::string uri = "ws://127.0.0.1:" + std::to_string(mPort);
        WebsocketClient::connection_ptr connection = mWebsocket.get_connection(uri, ec);
        if (ec)
        {
            DebugPrint("Connect initialization error: %s\n", ec.message().c_str());
            return;
        }
    
        mConnectionHandle = connection->get_handle();
    
        // Note that connect here only requests a connection. No network messages are
        // exchanged until the event loop starts running in the next line.
        mWebsocket.connect(connection);
    
        // Start the ASIO io_service run loop
        // this will cause a single connection to be made to the server. mWebsocket.run()
        // will exit when this connection is closed.
        mWebsocket.run();
    }
    catch (websocketpp::exception const & e)
    {
        // Prevent an unused variable warning in release builds
        (void)e;
        DebugPrint("Websocket threw an exception: %s\n", e.what());
    }
}

这似乎使用了一些library called boost.asio?我在C#中能找到的最接近的东西是Windows.Networking.Socketsdocumentation here)中的MessageWebSocket,但这似乎只适用于Windows RT?
我如何在.NET控制台应用程序中创建类似的内容?我找到了对System.Net.WebSockets.ClientWebSocketdocumentation here)的引用,它似乎是我需要的类,但我不确定。
我找到了一些样本(such as this oneand this one-两者都使用了另一个套接字类Socket),它们显示了如何使用套接字,但它们似乎不是事件驱动的。然后立即接收数据。我需要一个调用本地方法的Web Socket(类似于事件处理程序)。我相信这就是上面示例C++代码中的情况。(特别是Open、Fail、Close和Message)。我的理解是我需要做一些工作("register" with the Stream Deck),然后处理web套接字“消息”事件并解析出Stream Deck报告发生了什么事件。

bq3bfh9z

bq3bfh9z1#

如果在示例https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socket?view=net-7.0中向下滚动几行,您将看到一个名为:分别处理发送和接收的异步模式。
发送部件

int bytesSent = 0;
    while (bytesSent < requestBytes.Length)
    {
        bytesSent += await socket.SendAsync(requestBytes.AsMemory(bytesSent), SocketFlags.None);
    }

如果你不想让程序锁定,最简单的方法是启动一个线程进行监听,也许?

相关问题