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

 

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
C#窗体客户端中,要实现断开连接的功能,可以在点击事件中添加相应的代码。在点击事件中,首先判断当前是否已经连接到服务端,如果是,则调用tcpClient.Disconnect(false)方法断开连接,并将IsConnected标志设置为false,同时修改按钮的文本为"请求连接"。如果当前未连接到服务端,则不执行断开连接的操作。以下是示例代码: ```csharp private void btnConnect_Click(object sender, EventArgs e) { try { if (IsConnected == false) { // 连接服务端的代码 // 断开连接的代码 tcpClient.Disconnect(false); IsConnected = false; btnConnect.Text = "请求连接"; } else { // 连接服务端的代码 // 设置连接标志和按钮文本 IsConnected = true; btnConnect.Text = "断开连接"; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } ``` 在上述代码中,根据IsConnected标志来判断当前是否已经连接到服务端。如果是,则执行断开连接的代码;如果不是,则执行连接服务端的代码,并设置连接标志和按钮文本。这样就可以实现C#窗体客户端断开连接功能。 #### 引用[.reference_title] - *1* *3* [C# TCP客户端窗体应用程序异步接收方式](https://blog.csdn.net/luobeihai/article/details/125958090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C#Socket 服务器&客户端学习笔记](https://blog.csdn.net/weixin_42901570/article/details/125998780)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI浩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值