在启动TCP服务器之前,如何优雅地启动C#TCP客户端
我正在编写一个相当简单的TCP/IP客户端应用程序。当我启动服务器(另一个独立的应用程序),然后按顺序启动客户机时,我能够成功连接。我想让客户端变得健壮,这样我就可以先启动它,而不会崩溃。另外,我不想让一个特殊的用户操作告诉客户端尝试连接。我还希望在客户机上使用非阻塞异步IO 为了尝试并实现这一点,我尝试使用Socket.BeginConnect方法。我的意图是,这个调用将产生一个后台线程,在建立连接之前,它将在EndConnect调用中被阻塞。这样,我的客户机可以在启动时调用此方法,然后继续操作。这是我的密码:在启动TCP服务器之前,如何优雅地启动C#TCP客户端,c#,multithreading,sockets,tcp,C#,Multithreading,Sockets,Tcp,我正在编写一个相当简单的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
有人能告诉我如何让这个异步连接等待服务器应用程序吗?提前谢谢
有人能告诉我如何让这个异步连接等待服务器吗
申请
没什么。每X秒循环运行一次,直到它启动或获得逻辑超时。TCP不会等待,您必须重试。当代码第一次需要连接时,根据用户的操作让客户端按需连接即可。如果连接失败,告诉用户他还不能这样做,不管是什么。我不久前写了一个异步TCP服务器的示例,它可能很有用: