【问题标题】:Communication between different SignalR hubs?不同 SignalR 集线器之间的通信?
【发布时间】:2021-10-05 03:51:50
【问题描述】:

我正在尝试制作一款使用与 Jackbox 游戏类似的设置的游戏。这基本上意味着您有一个主机客户端,移动客户端可以通过转到https://jackbox.tv 并输入房间代码+玩家名称来访问它。无需在手机上下载。

这是我的设置:

  • Unity 主机客户端 - 将用于建立房间。 (C#、.NET 2.0 标准)
  • React Native Player Client - 玩家将使用它与游戏互动。 (JavaScript,世博会)
  • 服务器客户端 - 使用 SignalR 作为后端技术将游戏和玩家链接在一起的服务器。 (C#、.NET 5)

我现在的问题是我不太清楚如何让我的两个集线器相互通信。这两个中心是:

  • HostHub - 这是 Unity 客户端连接的地方,以便服务器知道哪些游戏可用以及哪些玩家可用。
  • GameHub - 这是玩家客户端连接的地方,并将被分配到房间。

我在服务器客户端上有一个 ServerManager 的 Singleton 实例,用于保存 GamePlayer 对象以及检索它们(稍后我将添加适当的持久性管理)。

所以当我尝试在我的 Host- 或 GameHub 中使用这样的 C# 事件时:

...
ServerManager.Instance.OnPlayerJoinedRoom += ServerManager_OnPlayerJoinedRoom;
...

private void ServerManager_OnPlayerJoinedRoom(object sender, (string, string, string) info)
{
    IClientProxy host = Clients.Client(info.Item1);
    host.SendAsync("PlayerJoined", Extensions.ParamArray(info.Item2, info.Item3));
}

我收到一条错误消息,提示 Clients 已处置,因此我无法访问它。我发现这是因为这些是非常轻的物体,按照设计,它们的使用寿命很短。

那么我还能做些什么来让 Hub 相互通信,或者这不是 SignalR 的方法?

【问题讨论】:

  • 这与让 2 个控制器相互通信基本相同 -> 它不应该发生,并且 SDK 没有提供实现它的简单方法。但是,目前还不清楚集线器之间是如何相互通信的,您能否扩展您的示例代码?
  • 哦,好吧。那么这就解释了这个问题。我确实理解控制器的类比。
  • 基本上我试图做的是说ServerManager 类将充当“桥梁”,并且简单地具有任一集线器可以通过某些方法调用触发的事件。然后接收中心可以通过ServerManager 订阅这些事件。但如果这不可能,那么我将不得不重做我的结构。
  • 看起来您应该尝试使用IHubContext<YourHub>。这是一种从集线器外部向客户端发送消息的方法,docs.microsoft.com/aspnet/core/signalr/…
  • 您应该只有一个信号但有多个集线器。这样 HostHub 和 GameHub 可以共享相同的上下文和集合:docs.microsoft.com/en-us/aspnet/signalr/overview/…

标签: c# signalr signalr-hub


【解决方案1】:

在 OWIN 启动时注册多个端点:

app.UseEndpoints(ep => { ep.MapHub<HostHub>("/hostHub"); ep.MapHub<GameHub>("/gameHub"); }

然后在您的客户端(即:JavaScript)中连接所需的端点:

var conn = new signalR.HubConnectionBuilder().withUrl('https://localhost:5000/gameHub');

所有集线器共享相同的“/signalr”端点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多