尝试Catch,使用事件处理程序

时间:2013-09-02 07:14:21

标签: c# winforms sockets try-catch

我有一个连接到我的服务器的客户端,现在使用以下代码进行连接。但是如果无法建立连接,则会创建一个事件,因此如果失败,我的主程序可以显示一条消息。但是这个事件没有被触发。如何纠正我的代码才能实现这一目标?

我的客户端套接字的包装类

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);
}

3 个答案:

答案 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语句