不同 SignalR 集线器之间的通信?
Communication between different SignalR hubs?
我正在尝试制作一款使用与 Jackbox 游戏类似设置的游戏。它基本上意味着您有一个主机客户端,移动客户端可以通过转到 https://jackbox.tv 并输入房间代码 + 玩家名称来访问。 phone.
无需下载
这是我的设置:
- Unity Host Client - 将用于建立房间。 (C#、.NET 2.0 标准)
- React Native Player Client - 玩家将用来与游戏互动。 (JavaScript, 博览会)
- 服务器客户端 - 将 link 游戏和玩家一起使用 SignalR 作为后端技术的服务器。 (C#、.NET 5)
我现在遇到的问题是我不太清楚如何让我的两个集线器相互通信。这两个枢纽是:
- HostHub - 这是 Unity 客户端连接的地方,因此服务器知道哪些游戏可用以及有哪些玩家。
- GameHub - 这是玩家客户端连接并将分配到房间的地方。
我在服务器客户端上有一个 ServerManager
的单例实例,用于保存 Game
和 Player
对象以及检索它们(我将添加适当的持久性管理稍后)。
因此,当我尝试在我的主机或 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
已处置,因此我无法访问它。我发现这是因为这些是非常轻的物体,在设计上它们在被处理之前的寿命非常短。
那么我还能做些什么来让集线器相互通信,或者这不是 SignalR 的方法?
在 OWIN 启动中注册多个端点:
app.UseEndpoints(ep => { ep.MapHub<HostHub>("/hostHub"); ep.MapHub<GameHub>("/gameHub"); }
然后在您的客户端(即:JavaScript)中连接所需的端点:
var conn = new signalR.HubConnectionBuilder().withUrl('https://localhost:5000/gameHub');
所有集线器共享相同的“/signalr”端点
我正在尝试制作一款使用与 Jackbox 游戏类似设置的游戏。它基本上意味着您有一个主机客户端,移动客户端可以通过转到 https://jackbox.tv 并输入房间代码 + 玩家名称来访问。 phone.
无需下载这是我的设置:
- Unity Host Client - 将用于建立房间。 (C#、.NET 2.0 标准)
- React Native Player Client - 玩家将用来与游戏互动。 (JavaScript, 博览会)
- 服务器客户端 - 将 link 游戏和玩家一起使用 SignalR 作为后端技术的服务器。 (C#、.NET 5)
我现在遇到的问题是我不太清楚如何让我的两个集线器相互通信。这两个枢纽是:
- HostHub - 这是 Unity 客户端连接的地方,因此服务器知道哪些游戏可用以及有哪些玩家。
- GameHub - 这是玩家客户端连接并将分配到房间的地方。
我在服务器客户端上有一个 ServerManager
的单例实例,用于保存 Game
和 Player
对象以及检索它们(我将添加适当的持久性管理稍后)。
因此,当我尝试在我的主机或 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
已处置,因此我无法访问它。我发现这是因为这些是非常轻的物体,在设计上它们在被处理之前的寿命非常短。
那么我还能做些什么来让集线器相互通信,或者这不是 SignalR 的方法?
在 OWIN 启动中注册多个端点:
app.UseEndpoints(ep => { ep.MapHub<HostHub>("/hostHub"); ep.MapHub<GameHub>("/gameHub"); }
然后在您的客户端(即:JavaScript)中连接所需的端点:
var conn = new signalR.HubConnectionBuilder().withUrl('https://localhost:5000/gameHub');
所有集线器共享相同的“/signalr”端点