【发布时间】:2016-04-02 00:09:03
【问题描述】:
我有一个客户端/服务器应用程序,用户需要输入服务器的 IP 地址才能连接到它。如果用户输入的不是 IP 地址,我会得到一个未处理的异常。如果用户输入了错误的 IP 地址,应用程序将完全冻结并必须强制关闭。
如果用户输入了 IP 地址以外的内容(而不是显示未处理的异常错误),我已经设法使用 try-catch 来弹出友好的错误消息,这允许他们重试。但是如果用户输入 IP 地址,我不知道如何弹出相同的消息框,但它是错误的 IP 地址(以避免程序冻结)。
这是一个显示我的连接过程的 sn-p:
try
{
System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg", ServerIPbox.Text);
string ServerIP = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg");
serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), 8888);
}
catch (FormatException)
{
MessageBox.Show("Invalid IP address");
return;
}
catch (SocketException)
{
return;
}
在我的客户端应用程序中;用户在文本框中输入运行服务器应用程序的机器的 IP 地址,然后按 Enter 或单击连接按钮以启动 try 块。
我对 C# 还很陌生,所以我不确定这是否可行;但理想情况下,我希望客户端能够在尝试连接之前检查输入的 IP 地址是否实际上是服务器的 IP 地址。这样我就可以完全避免异常,而且这似乎是正确的方法,而不是在友好的弹出窗口后面隐藏错误消息。
编辑:我尝试使用 Darshan Patel 的答案,但遇到了一些问题。首先,这是我的代码:
private void ConnectButton_Click(object sender, EventArgs e)
{
System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg", ServerIPbox.Text);
string ServerIP = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg");
try
{
var myRequest = (HttpWebRequest)WebRequest.Create(ServerIP);
var response = (HttpWebResponse)myRequest.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), 8888);
//CONNECT TO SERVER
Client.Connect(serverEndPoint);
SendMessage("Client Connected (" + DateTime.Now + ")");
}
}
catch (Exception ex)
{
MessageBox.Show("Unable to connect : " + ex.Message);
}
现在我每次单击连接按钮时都会收到“无法连接..”消息,无论我是否成功连接。
此外,在收到“无法连接..”消息后,我的代码继续运行,而不是停留在原来的位置并允许用户尝试输入正确的 IP 地址。
编辑 2:这是修改我的原始代码的另一种尝试:
private void ConnectButton_Click(object sender, EventArgs e)
{
try
{
//ATTEMPT TO CONNECT TO SERVER
serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIPbox.Text), 8888);
Client.Connect(serverEndPoint);
}
//INCORRECT IP ADDRESS WAS ENTERED
catch (Exception)
{
MessageBox.Show("Please enter a valid IP address");
return;
}
//SUCCESSFULLY CONNECTED TO SERVER
System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg", ServerIPbox.Text);
在此尝试中,我的代码捕获了任何不是 IP 地址的内容,并在将其写入“ServerIP.cfg”文件之前将其停止,并显示“无效 IP 地址”消息,允许用户重试。
一旦用户输入 IP 地址,它就会被保存到“ServerIP.cfg”文件中,并且(理想情况下)它们会连接到服务器。
唯一的问题是;如果用户输入了 IP 地址,但它不是运行服务器的机器的 IP,则应用停止响应。
如果用户输入 9 个数字的任意组合(程序似乎认为是 IP 地址),应用也会停止响应
在让程序尝试连接之前,我需要一种可靠的方法来检查用户输入的 IP 地址(或 9 个数字)实际上是否是运行服务器的机器的正确 IP 地址给它。这样我就可以阻止应用在连接尝试失败时冻结。
【问题讨论】:
-
IP地址指向服务器?
-
如果您问“IP 地址是否指向服务器?”答案是肯定的。
-
ServerIP 的输出是什么???
-
ServerIP 是用户在 textbox.text 中输入的 IP 地址,我将其保存到 ServerIP.cfg,这样他们就不必每次登录客户端时都输入 IP 地址
标签: c# exception server client ip-address