我正在努力建立SignalR服务器和客户端架构,我能够连接到“http://localhost:8080”或http://127.0.0.1:8080/,但我无法连接我的本地IP地址,如“192. xxx “那么可能是什么原因? 请帮助我,我也将我的代码放在一边......
public partial class WinFormsServer : Form
{
private IDisposable SignalR { get; set; }
const string ServerURI = "http://localhost:8080";
private void ButtonStart_Click(object sender, EventArgs e)
{
WriteToConsole("Starting server...");
ButtonStart.Enabled = false;
Task.Run(() => StartServer());
}
private void StartServer()
{
try
{
SignalR = WebApp.Start(ServerURI);
}
catch (TargetInvocationException)
{
WriteToConsole("Server failed to start. A server is already running on " + ServerURI);
//Re-enable button to let user try to start server again
this.Invoke((Action)(() => ButtonStart.Enabled = true));
return;
}
this.Invoke((Action)(() => ButtonStop.Enabled = true));
WriteToConsole("Server started at " + ServerURI);
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
}
答案 0 :(得分:1)
我尝试了不同的解决方案但找不到正确的解决方案。
最后我发现该问题仅与权限有关。 以管理员身份运行SignalR服务器应用程序 。它将开始在本地IP上运行,如 192.168.X.X:9090 ,然后您的客户端应用程序可以使用此IP地址从任何其他PC连接此服务器。
class Program
{
static void Main(string[] args)
{
var url = $"http://{GetLocalIPAddress()}:8080";
using (WebApp.Start<Startup>(url))
{
Console.WriteLine($"Server running at {{{url}}}");
Console.ReadLine();
}
}
public static string GetLocalIPAddress()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
throw new Exception("Local IP Address Not Found!");
}
}
答案 1 :(得分:0)
要获得local IP address
,您可以使用此功能:
public static string GetLocalIPAddress()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
throw new Exception("Local IP Address Not Found!");
}
如果您想使用FQDN - 完全限定域名,则可以使用此功能:
public static string GetLocalFQDN()
{
var props = IPGlobalProperties .GetIPGlobalProperties();
return props.HostName + (string.IsNullOrWhiteSpace(props.DomainName) ? "" : "." + props.DomainName);
}
之后你可以使用:
SignalR = WebApp.Start("http://" + GetLocalFQDN() + ":8080");
或
SignalR = WebApp.Start("http://" + GetLocalIPAddress() + ":8080");
我希望这会有所帮助。
答案 2 :(得分:0)
由于您使用的是this source,我也使用了相同的词 - 对于FQDN,首先创建下面的函数。
public static string GetLocalFQDN()
{
var props = IPGlobalProperties.GetIPGlobalProperties();
return props.HostName + (string.IsNullOrWhiteSpace(props.DomainName) ? "" : "." + props.DomainName);
}
然后将const string ServerURI
修改为:
string ServerURI =String.Concat("http://",GetLocalFQDN(),":8080");
- 对于LocalIPAdress,首先创建下面的函数,该函数将是您的本地地址:
public static string GetLocalIPAddress()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
throw new Exception("Local IP Address Not Found!");
}
并将string ServerURI =String.Concat("http://",GetLocalFQDN(),":8080");
更改为:
string ServerURI =String.Concat("http://",GetLocalIPAddress(),":8080");
希望这会对你有所帮助。
注意:更改应在WinFormsServer:Form
项目的WinFormsServer
课程中完成。