You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SignalR本地连接正常但跨PC无法连接问题求助

问题描述

我正在开发一款采用客户端-服务器-客户端架构的Unity应用,以下是我的服务器代码:

class Program { 
    static IDisposable SignalR; 
    static void Main(string[] args) { 
        string url = "http://localhost:8089"; 
        //string url = "http://127.0.0.1:8088"; 
        SignalR = WebApp.Start(url); 
        Console.ReadKey(); 
    } 
    public class Startup { 
        public void Configuration(IAppBuilder app) { 
            app.UseCors(CorsOptions.AllowAll); 
            app.MapSignalR(); 
        } 
    } 
    [HubName("MyHub")] 
    public class MyHub : Hub { 
        public void Send(Guid name, int[] message) { 
            //bramka - to co dostanie od jednego klienta rozpowie wszytskim 
            Console.WriteLine($"message sent from {name.ToString()}: move from {message[0]},{message[1]} to {message[2]},{message[3]}"); 
            Clients.All.addMessage(name, message); 
        } 
    } 

以及客户端部分代码:

var connection = new HubConnection("http://HERE IS IP ADDRESS OF SERVER:8089/"); 
myHub = connection.CreateHubProxy("MyHub"); 
connection.Start(); 

当客户端连接本地服务器时一切正常,但将服务器部署在其他PC时,客户端无法建立连接,报错信息为:InvalidOperationException: The connection has not been established.。我是编程新手,尤其对SignalR不熟悉,希望有人能提供解决思路。

解决思路与排查步骤

嘿,新手遇到跨机器的SignalR连接问题太正常了,咱们一步步来排查:

  • 修正服务器绑定地址
    你现在服务器绑定的是localhost,这个地址只能让服务器自己访问。要让其他机器连接,得改成服务器的局域网IP或者0.0.0.0(允许所有网卡接入):

    // 比如服务器局域网IP是192.168.1.100,改成这个
    string url = "http://192.168.1.100:8089";
    // 或者用0.0.0.0,适配所有网卡
    string url = "http://0.0.0.0:8089";
    

    改完一定要重启服务器!

  • 检查防火墙端口开放
    服务器的Windows防火墙(或者第三方杀毒软件防火墙)大概率会拦截8089端口的外部请求:

    1. 打开Windows Defender防火墙,进入「高级设置」
    2. 添加一条入站规则,允许TCP协议的8089端口连接
    3. 测试阶段可以临时关闭防火墙确认问题,之后一定要加规则,别一直关着
  • 修正客户端连接地址
    客户端里的"http://HERE IS IP ADDRESS OF SERVER:8089/"要替换成服务器的实际局域网IP,比如http://192.168.1.100:8089,注意不要加末尾的斜杠,避免路径问题。

  • 验证网络连通性
    在客户端PC上打开命令提示符,先ping服务器IP:

    ping 192.168.1.100
    

    如果ping不通,说明两台机器不在同一个局域网,或者网络本身有问题。如果ping通了,再用telnet测试端口:

    telnet 192.168.1.100 8089
    

    要是telnet连不上,还是端口被防火墙挡住了。

  • 检查SignalR版本兼容性
    确保Unity客户端用的SignalR客户端版本和服务器的版本完全匹配,比如服务器用的是Microsoft.AspNet.SignalR 2.x,客户端也要用对应的2.x版本的SignalR客户端包,版本不匹配会导致各种奇怪的连接失败。

  • 添加错误日志排查细节
    原客户端代码没有错误处理,加个回调能看到更具体的错误信息:

    connection.Start().ContinueWith(task => {
        if (task.IsFaulted) {
            Debug.LogError("连接失败详情:" + task.Exception.ToString());
        } else {
            Debug.Log("SignalR连接成功!");
        }
    });
    

    这样能帮你定位是DNS问题、端口问题还是协议不兼容的问题。


内容的提问来源于stack exchange,提问作者albcio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:11:50