SignalR远程客户端

时间:2017-01-13 20:39:46

标签: c# signalr

我想与另一台PC上的客户端连接到signalr。这意味着我不会使用localhost。我已经做了一个简单的networkdiscovery来获取正确的IP地址,但似乎信号器不允许远程客户端连接,即使我已经使用CorsOptions.AllowAll。

    class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var hubConfiguration = new HubConfiguration
        {
#if DEBUG
            EnableDetailedErrors = true
#else
        EnableDetailedErrors = false
#endif
        };
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR(hubConfiguration);
    }
}

我使用二元性,这是一个2D游戏引擎。这是服务器:

    public class SignalRServer : Component, ICmpInitializable
{
    private IDisposable _signalRServer;
    public int _port { get; set; } = 8080;

    public void StopServer()
    {
        if (_signalRServer != null)
            _signalRServer.Dispose();
    }

    public void OnInit(InitContext context)
    {
        if (context == InitContext.Activate && DualityApp.ExecContext == DualityApp.ExecutionContext.Game)
        {
            var networkDiscovery = new NetworkDiscovery(_port, "TestGame"); //Network discovery to get the ip adres of the server if one is found
            IPEndPoint ipEndPoint;
            if (networkDiscovery.LookForServer(out ipEndPoint))
            {
                try
                {
                    ConnectToServer(ipEndPoint).Wait();
                    Debug.WriteLine($"Connection established to {ipEndPoint}");
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Could not find server");
                }
            }
            else //No server was found so we create one
            {
                Debug.WriteLine("Starting signalR server");
                string url = $"http://*:{_port}"; //To test go to http://localhost:8080/signalr/hubs
                networkDiscovery.Start(); 
                _signalRServer = WebApp.Start<Startup>(url);
            }
        }
    }

    private async Task ConnectToServer(IPEndPoint ipEndPoint)
    {
        var hubConnection = new HubConnection($"http://{ipEndPoint}/");
        IHubProxy hubProxy = hubConnection.CreateHubProxy(nameof(MyHub));
        hubProxy.On<string, string>(nameof(MyHub.Send), (name, message) =>
        {
            Debug.WriteLine("Incoming data: {0} {1}", name, message);
        });
        ServicePointManager.DefaultConnectionLimit = 10;
        await hubConnection.Start();

    }

    public void OnShutdown(ShutdownContext context)
    {
        StopServer();
    }
}

和中心:

    public class MyHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.addMessage(name, message);
    }

    public override Task OnConnected()
    {
        Debug.WriteLine("Client connected: " + Context.ConnectionId);
        Send("Server", $"Client with id {Context.ConnectionId} has connected");
        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        Debug.WriteLine("Client disconnected: " + Context.ConnectionId);
        return base.OnDisconnected(stopCalled);
    }
}

0 个答案:

没有答案