Переподключите TcpClient к серверу, если он падает - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь сделать Steam Как друзья Клиент ...

Я могу подключить к серверу , но как это сделать? Я переподключаюсь , если сервер дает сбой ... и продолжает повторное подключение , пока сервер не запустится снова ...


public void ConnectToUserServer()
       {
           lb_ConnectStatus.Text = "Connecting ... ";
           lb_ClientInfo.Text = "";

           byte[] sendBytes = new byte[10025];

           UserName = tb_UserName.Text;

           //Create an instance of TcpClient. 
           IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(serverName), UsersPort);


           tcpClient.Connect(ipend);

           lb_ConnectStatus.Text = "Connected ... ";
           string HostName = Dns.GetHostName().ToString();

           IPAddress[] IpInHostAddress = Dns.GetHostAddresses(HostName);

           string IPV4Address = IpInHostAddress[2].ToString(); //Default IPV4Address.


           // LocalEndPoint will return the ip address and port to which the tcp connection is accepted
           var clientIpLAN = tcpClient.Client.LocalEndPoint;

           lb_ClientInfo.Text = HostName + " " + IPV4Address;

           networkStream = tcpClient.GetStream();
           send = UserName + " : " + IPV4Address;

           sendBytes = Encoding.ASCII.GetBytes(send);
           networkStream.Write(sendBytes, 0, sendBytes.Length);

           t = new Thread(DoWork);
           t.IsBackground = true;
           t.Start();

       }

Получает список пользователей с сервера


       public void DoWork()
       {

           byte[] bytes = new byte[1024];

           while (true)  
           { 
             int  bytesRead = networkStream.Read(bytes, 0, bytes.Length);

           }
           tcpClient.Close();
           ConnectToUserServer();

       }

Спасибо invvv

1 Ответ

1 голос
/ 10 апреля 2020

Оберните любые действия, такие как чтение или запись в Try .. Catch .., и поймайте все ошибки. Затем в вашем улове вы пытаетесь восстановить соединение. Если переподключение прошло успешно, повторите попытку. Если нет, то сбросьте ошибку и, наконец, остановитесь. Или повторите попытку навсегда.

Существует также популярная библиотека. net для этого, Полли .

// Retry once
Policy
  .Handle<SomeExceptionType>()
  .Retry()

// Retry multiple times
Policy
  .Handle<SomeExceptionType>()
  .Retry(3)

// Retry multiple times, calling an action on each retry 
// with the current exception and retry count
Policy
    .Handle<SomeExceptionType>()
    .Retry(3, onRetry: (exception, retryCount) =>
    {
        // Add logic to be executed before each retry, such as logging
    });

В вашем случае, что-то вроде этого:

        public void DoWork()
        {

            byte[] bytes = new byte[1024];

            int bytesRead;
            while (true)
                try
                {
                    bytesRead = networkStream.Read(bytes, 0, bytes.Length);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Could not get data from network stream, trying to reconnect. " + e.Message);

                    tcpClient.Reconnect(); // Do your reconnect here.

                    if (!tcpClient.isConnected)
                    {
                        Console.WriteLine("Could not reconnect, rethrowing error");
                        throw e;
                    }

                }


            tcpClient.Close();
            ConnectToUserServer();

        }
...