C# 实现客户端Socket断开后重新连接。

思路:使用System.Threading.Timer类每秒检测一次是否连接,如果没有处于连接状态,则尝试连接一次,如果连接失败,则将异常信息捕捉,并记录日志,然后Sleep2秒,再尝试连接,一直重复连接的步骤。

 System.Threading.Timer timer = null;
 private void BtnConnect_Click(object sender, RoutedEventArgs e)
 {
            
            timer = new Timer(new TimerCallback(TimerCall),null,Timeout.Infinite,1000);
            timer.Change(0, 1000);
  }
 private void TimerCall(object obj)
 {
            if (!IsSocketConnected(socketWatch))
            { 
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        string connectIP = txtIP.Text;
                        string port = txtPort.Text;

                    try
                    {
                        socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        IPAddress address = IPAddress.Parse(connectIP);
                        socketWatch.Connect(address, int.Parse(port));
                        threadWatch = new Thread(RecMsg);
                        threadWatch.IsBackground = true;
                        threadWatch.Start();
                        }
                        catch
                        { Thread.Sleep(2000); }
                    }));
               
            }
        }
        private bool IsSocketConnected(Socket socket)
        {
            lock (this)
            {
                bool ConnectState = true;
                bool state = socket.Blocking;
                try
                {
                    byte[] temp = new byte[1];
                    socket.Blocking = false;
                    socket.Send(temp, 0, 0);
                    ConnectState = true;
                }
                catch (SocketException e)
                {
                    if (e.NativeErrorCode.Equals(10035)) //仍然是connect的
                        ConnectState = true;
                    else
                        ConnectState = false;
                }
                finally
                {
                    socket.Blocking = state;
                }
                return ConnectState;
            }
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值