我正在为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.Sockets
(documentation here)中的MessageWebSocket
,但这似乎只适用于Windows RT?
我如何在.NET控制台应用程序中创建类似的内容?我找到了对System.Net.WebSockets.ClientWebSocket
(documentation here)的引用,它似乎是我需要的类,但我不确定。
我找到了一些样本(such as this one,and this one-两者都使用了另一个套接字类Socket
),它们显示了如何使用套接字,但它们似乎不是事件驱动的。然后立即接收数据。我需要一个调用本地方法的Web Socket(类似于事件处理程序)。我相信这就是上面示例C++代码中的情况。(特别是Open、Fail、Close和Message)。我的理解是我需要做一些工作("register" with the Stream Deck),然后处理web套接字“消息”事件并解析出Stream Deck报告发生了什么事件。
1条答案
按热度按时间bq3bfh9z1#
如果在示例https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socket?view=net-7.0中向下滚动几行,您将看到一个名为:分别处理发送和接收的异步模式。
发送部件
如果你不想让程序锁定,最简单的方法是启动一个线程进行监听,也许?