如何在启动TCP服务器之前优雅地启动我的C#TCP客户端

本文关键字:启动 我的 C#TCP 客户端 TCP 服务器 | 更新日期: 2023-09-27 17:58:13

我正在编写一个相当简单的TCP/IP客户端应用程序。当我启动服务器(另一个单独的应用程序),然后按顺序启动客户端时,我能够成功连接。我想让客户变得强大,这样我就可以先启动它,它不会坏。此外,我不希望有一个特殊的用户操作来告诉客户端尝试连接。我还想在客户端上使用非阻塞异步IO。

为了尝试并实现这一点,我尝试使用Socket.BeginConnect方法。我的意图是,这个调用将生成一个后台线程,在建立连接之前,该线程将在EndConnect调用中被阻止。这样,我的客户端可以在启动时调用此方法,然后继续操作。这是我的代码:

public bool Init_Port(string Host)
    {
        IPHostEntry ipHostInfo = Dns.Resolve(Host);
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, PORT);
        try
        {
            //Create the connection
            My_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            My_Socket.BeginConnect(localEndPoint, new AsyncCallback(Connect_To_Port), My_Socket);
        }
        catch (Exception e)
        {
            ErrorHandler(e.Message);
            return false;
        }
        return true;
    }
    private void Connect_To_Port(IAsyncResult ar)
    {
        try
        {
            if (My_Socket != null)
            {
                //will block the thread until a connection is made
                My_Socket.EndConnect(ar);
                Connection_Flag = true;
                //Setup the asynchronous read
                My_Socket.BeginReceive(Rx_Buffer, 0, SOCKET_BUFFER_SIZE, 0,
                                                new AsyncCallback(Read_Port), My_Socket );
            }
        }
        catch (Exception e)
        {
            ErrorHandler(e.Message);
        }
    }

我在不启动服务器应用程序的情况下对此进行测试。我希望在我的服务器应用程序启动之前,该线程将在EndConnect上被阻止。我观察到EndConnect立即返回,并且我得到错误消息

无法建立连接,因为目标计算机主动拒绝它127.0.0.1:50042

有人能告诉我我能做些什么让这个异步连接等待服务器应用程序吗?提前谢谢。

如何在启动TCP服务器之前优雅地启动我的C#TCP客户端

有人能告诉我我能做些什么让这个异步连接等待服务器吗应用

什么都没有。你每X秒循环运行一次,直到它启动或者你得到一个逻辑超时。TCP不会等待,您必须重试。

当代码第一次需要连接时,根据用户的操作,让客户端按需连接即可。如果连接失败,告诉用户他还不能这样做,不管是什么。