c# - 使用事件处理程序尝试 Catch

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

最佳答案

那是因为在您将事件绑定(bind)到它之前,您的构造函数已经连接。 您应该使用构造函数以外的方法进行连接:

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

只有在您连接之前绑定(bind)时才会触发该事件。

关于c# - 使用事件处理程序尝试 Catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18567535/

相关文章:

c# - 手部检测导致光标不稳定

c# - RelayCommand 未执行

c# - Mono 不支持 System.Runtime.Serialization.DataMemberAttribute EmitDefaultValue 设置

.net - 如何使用Observable.FromEvent代替FromEventPattern并避免使用字符串文字事件名称

c++ - 将 IPv4 地址从 ifaddrs 结构分配给 sockaddr_in 结构

c# - 在流对象C#中使用GetStream方法

java - BufferedReader.ready() 行为的差异

c# - Rowcommand 触发前 Gridview 中 LinkBut​​ton 的确认框

c# - 限制 MDI 应用程序中的窗口实例数

c# - 如何在 Windows 应用程序中处理 Ctrl + Break 或 Ctrl + Pause