首页 > 解决方案 > 如何在 Unity 的 C# 中获取服务器端事件(onmessage)?

问题描述

我对 SSE(或一般的 Web 开发)完全没有经验,所以请原谅我的无知。我试图onmessage从 Unity 的 C# 中的 SSE 流中获取事件。我需要它持续运行(最好是异步的),因为这些事件不断发生。

对于上下文,我试图从以下位置获取事件:https ://www.blaseball.com/events/streamGameData

我试图在 Javascript 中复制的行为是:

const evtSource = new EventSource(https://www.blaseball.com/events/streamGameData, {});
evtSource.onmessage = function(event) {
    var data = JSON.parse(event.data)["value"];
    // Use data here
}

到目前为止,我已经尝试过:

网络请求

我在使用 WebRequest 的 Github jist 上找到了一些示例代码(代码如下)。这有效,并给了我正确的数据,但我不明白我如何(如果有的话)只能以onmessage这种方式获取事件,如提供的 JS。显然,这段代码只是将应用程序锁定在当前状态。

void Main()
{
    var request = WebRequest.Create(new Uri(url));
    var response = request.GetResponse();
    var stream = response.GetResponseStream();
    var encoder = new UTF8Encoding();
    var buffer = new byte[2048];

    while(true)
    {
        if (!stream.CanRead)
            return;

        int length = stream.Read(buffer, 0, 2048);
        if (length > 0) 
        {
            var text = encoder.GetString(buffer, 0, length);
            // Parse...
        }
    }
}

服务堆栈

我尝试使用 ServiceStack ServerEventsClient( Link ) 来获取事件。我在 VSCode 中构建了 NuGet 包,并将 .netstandard2.0 构建放在 Unity 的 Plugins 文件夹中。这些包在 Unity 中编译得很好,我可以毫无问题地访问它们的 API。

然而,await client.Connect()永远不会回来。我承认我并不真正了解这些 API。我使用上面链接中的代码逐字使用Using C# Async/Await friendly API’s,我也尝试client.Start()了很好的措施。没有什么。然而,ServiceStack 文档中的一行表明这仅适用于 ServiceStack 服务器?(我对 SSE 了解不够,无法理解其中的区别)

async void Connect()
{
    var client = new ServerEventsClient("https://www.blaseball.com/events/streamGameData");
    client.OnMessage += (evt) =>
    {
        Debug.Log("Message!");
    };
    client.Start();
    
    ServerEventConnect connectMsg = await client.Connect();
    // Never gets here...
}

谁能解释我在使用 ServerStack 时做错了什么,或者这条路线是否可行?或者也许对 Web 请求方法有帮助?其他方法或库的建议也非常受欢迎......

标签: c#unity3dservicestack

解决方案


推荐阅读