我有一个连接到我的服务器的客户端,现在使用以下代码进行连接。但是如果无法建立连接,则会创建一个事件,因此如果失败,我的主程序可以显示一条消息。但是这个事件没有被触发。如何纠正我的代码才能实现这一目标?
我的客户端套接字的包装类
public class ClientWrapper
{
Socket clientSocket;
public delegate void ErrorMessageHandler(string errorMsg);
public event ErrorMessageHandler OnErrorRecieved;
public ClientWrapper(IPAddress serverIP, int port)
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(serverIP, port));
}
catch (Exception e)
{
if (OnErrorRecieved != null)
OnErrorRecieved(e.Message);
}
}
}
在我的程序代码中,使用事件
//Connect to Server
ClientWrapper clientSocket = new ClientWrapper(serverIP, port);
//Event trigger if client fails to connect to server
clientSocket.OnErrorRecieved += new ClientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
事件的方法
void clientSocket_OnErrorRecieved(string errorMsg)
{
MessageBox.Show("No response from server. This can be caused if Server is offline or incorrect detail is provided.", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
答案 0 :(得分:4)
这是因为在将事件绑定到它之前,构造函数已经连接了。 您应该使用构造函数以外的方法进行连接:
public void Connect(IPAddress serverIP, int port)
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(serverIP, port));
}
catch (Exception e)
{
if (OnErrorRecieved != null)
OnErrorRecieved(e.Message);
}
}
以这种方式构建它。
ClientWrapper clientSocket = new ClientWrapper();
clientSocket.OnErrorRecieved += new clientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
clientSocket.Connect(serverIP, port);
只有在连接之前绑定事件时才会触发事件。
答案 1 :(得分:0)
在你注册事件处理程序之前看起来你的事件会失败,因为你在onstructor中提升它。
您可以尝试的方法有很多选项,例如将事件处理程序传递给构造函数,以便它可以在被调用之前订阅它,或者将连接代码分解为单独的方法,以便为消费者提供服务有机会自己订阅错误处理程序。
答案 2 :(得分:0)
当你拨打电话
时ClientWrapper clientSocket = new ClientWrapper(serverIP, port);
构造函数开始运行。只有当它结束然后你连接事件
clientSocket.OnErrorRecieved += new ClientWrapper.ErrorMessageHandler(clientSocket_OnErrorRecieved);
你有2种简单可能的方法。
第一个是Jeroen van Langen提出的建议。
第二个是在委托的构造函数中询问:
public ClientWrapper(IPAddress serverIP, int port, ErrorMessageHandler method)
{
OnErrorRecieved += method;
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(serverIP, port));
}
catch (Exception e)
{
if (OnErrorRecieved != null)
OnErrorRecieved(e.Message);
}
}
另外,使用socket
时请使用using
语句