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端口的外部请求:- 打开Windows Defender防火墙,进入「高级设置」
- 添加一条入站规则,允许TCP协议的8089端口连接
- 测试阶段可以临时关闭防火墙确认问题,之后一定要加规则,别一直关着
修正客户端连接地址
客户端里的"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

