如何在Unity中的C#中获取服务器端事件消息?

问题描述

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

对于上下文,我尝试从以下事件获取事件: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上找到了一些示例代码(下面的代码)。这样可以正常工作,并且可以为我提供正确的数据,但是我不了解(如果有的话)我只能如何像这样提供的JS那样获得onmessage事件。显然,这段代码只是将应用程序锁定在当前状态。

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,2048);
        if (length > 0) 
        {
            var text = encoder.GetString(buffer,length);
            // Parse...
        }
    }
}

服务栈

我尝试使用ServiceStack ServerEventsClientLink)来获取事件。我在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 Request方法有所帮助?也非常欢迎其他方法或库的建议...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)