c# TcpClient 客户端断线重连类库

初始化未连接到服务器重新连接

发送消息失败重新连接,

断线重新连接

欢迎测试,分享使用!

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;

namespace MyTcpClient
{
    //规范命名、添加注释、合理封装、限制访问权限    
    public class AsyncTcpClient
    {
        private string ip1;
        private int port1;
        byte[] ReadBytes = new byte[1024];
        //单例
        TcpClient tcpClient;
        //连接服务器
        public void ConnectServer(string ip, int port)
        {
            //防止多个事例去重复连接
            if (isTryingToCon == true)
            {
                return;
            }
            ip1 = ip;
            port1 = port;
            try
            {
                if (tcpClient != null)
                {
                    tcpClient.Close();
                }
                tcpClient = new TcpClient();
                isTryingToCon = true;
                //开始异步
                tcpClient.BeginConnect(IPAddress.Parse(ip), port, Lianjie, null);
            }
            catch (Exception e)
            {
            }
        }
        private bool isTryingToCon = false;
        //连接判断
        void Lianjie(IAsyncResult ar)
        {
            if (IsClose)
            {
                return;
            }
            if (tcpClient.Connected == false)
            {
                SetCon(0);
                tcpClient.Close();
                tcpClient = new System.Net.Sockets.TcpClient();
                //尝试重连。。。。。。;
                tcpClient.BeginConnect(IPAddress.Parse(ip1), port1, Lianjie, null);
            }
            else
            {
                //连接上了
                isTryingToCon = false;
                //结束异步连接
                tcpClient.EndConnect(ar);
                //读取数据
                tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
                SetCon(1);
            }
        }


        //接收消息
        void ReceiveCallBack(IAsyncResult ar)
        {
            try
            {
                int len = tcpClient.GetStream().EndRead(ar);//结束异步读取
                if (len > 0)
                {
                    MyEventArgs e = new MyEventArgs(ip1, ReadBytes);
                    _MsgChange(e);
                    //重置数据,防止旧数据残留
                    ReadBytes = new byte[1024];
                    tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
                }
                else
                {
                    //尝试重连。。。。。。"
                    ConnectServer(ip1, port1);
                }
            }
            catch (Exception e)
            {
            }
        }

        //发送消息
        public bool SendMsg(string msg)
        {
            try
            {
                //开始异步发送
                byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
                tcpClient.GetStream().BeginWrite(msgBytes, 0, msgBytes.Length, (ar) =>
                {
                    tcpClient.GetStream().EndWrite(ar);//结束异步发送
                }, null);
                return true;
            }
            catch (Exception ex)
            {
                // int a = ex.NativeErrorCode;
                //尝试重连。。。。。。"
                ConnectServer(ip1, port1);
                return false;
            }
        }
        public bool SendMsg(byte[] msg)
        {
            try
            {
                //开始异步发送
                tcpClient.GetStream().BeginWrite(msg, 0, msg.Length, (ar) =>
                {
                    tcpClient.GetStream().EndWrite(ar);//结束异步发送
                }, null);
                return true;
            }
            catch (Exception ex)
            {
                //尝试重连。。。。。。"
                ConnectServer(ip1, port1);
                return false;
            }
        }
        bool IsClose = false;
        /// <summary>
        /// 断开连接
        /// </summary>
        public void Close()
        {
            IsClose = true;
            if (tcpClient != null && tcpClient.Client.Connected)
            {
                tcpClient.Close();
            }
            if (!tcpClient.Client.Connected)
            {
                tcpClient.Close();//断开挂起的异步连接
            }
        }
        int isConnected = -1;
        /// <summary>
        /// -1 初始化  0 未连接  1 连接
        /// </summary>
        /// <param name="_con"></param>
        private void SetCon(int _con)
        {
            if (isConnected != _con)
            {
                bool rel = false;
                if (_con == 1)
                {
                    rel = true;
                }
                isConnected = _con;
                MyEventArgs e = new MyEventArgs(ip1, rel);
                _ConChange(e);
            }
        }


        public class MyEventArgs : EventArgs
        {
            public string IP;
            public bool IsConnetct;
            public byte[] Msg;
            public MyEventArgs(string iP, byte[] msg)
            {
                IP = iP;
                Msg = msg;
            }
            public MyEventArgs(string iP, bool iscon)
            {
                IP = iP;
                IsConnetct = iscon;
            }
        }
        //连接状态
        public delegate void ConChange(object sender, MyEventArgs args);
        public event ConChange OnConChange;
        protected virtual void _ConChange(MyEventArgs e)
        {
            if (OnConChange != null)
            {
                OnConChange(this, e);
            }
        }
        //收到的消息
        public delegate void MsgChange(object sender, MyEventArgs args);
        public event MsgChange OnMsgChange;
        protected virtual void _MsgChange(MyEventArgs e)
        {
            if (OnMsgChange != null)
            {
                OnMsgChange(this, e);
            }
        }
    }
}

调用方法

        AsyncTcpClient sw = new AsyncTcpClient();
        private void Form1_Load(object sender, EventArgs e)
        {
            sw.ConnectServer("192.168.1.19", 8000);
            sw.OnConChange += Sw_OnConChange;
            sw.OnMsgChange += Sw_OnMsgChange;
        }

        private void Sw_OnMsgChange(object sender, AsyncTcpClient.MyEventArgs args)
        {
            string str = Encoding.UTF8.GetString(args.Msg, 0, args.Msg.Length);
            str = Uri.UnescapeDataString(str);
            Invoke(new MethodInvoker(delegate ()
            {
                label2.Text = args.IP + "___" + str;
            }));

        }

        private void Sw_OnConChange(object sender, AsyncTcpClient.MyEventArgs args)
        {
            Invoke(new MethodInvoker(delegate ()
            {
                label1.Text = args.IP + "___" + args.IsConnetct.ToString();
            }));
        }

        private void button1_Click(object sender, EventArgs e)
        {

           bool rel= sw.SendMsg("asdf");
            button1.Text = rel.ToString();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            sw.OnConChange -= Sw_OnConChange;
            sw.OnMsgChange -= Sw_OnMsgChange;
            sw.Close();

        }

测试出Gug后请留言,万分感谢!!!

C#断线重现升级版 有接收字符分割功能.

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
前 言 6 第1章 进程、线程与网络协议 7 1.1 进程和线程 7 1.1.1 Process类 7 1.1.2 Thread类 9 1.1.3 在一个线程中操作另一个线程的控件 13 1.2 IP地址与端口 15 1.2.1 TCP/IP网络协议 16 1.2.2 IPAddress类与Dns类 17 1.2.3 IPHostEntry类 17 1.2.4 IPEndPoint类 17 1.3 套接字 19 1.3.1 Socket类 20 1.3.2 面向连接的套接字 21 1.3.3 无连接的套接字 23 1.4 网络流 24 1.5 习题1 25 第2章 TCP应用编程 27 2.1 同步TCP应用编程 28 2.1.1 使用套接字发送和接收数据 28 2.1.2 使用NetworkStream对象发送和接收数据 30 2.1.3 TcpClientTcpListener类 31 2.1.4 解决TCP协议的无消息边界问题 33 2.2 利用同步TCP编写网络游戏 34 2.2.1 服务器端编程 34 2.2.2 客户端编程 49 2.3 异步TCP应用编程 66 2.3.1 EventWaitHandle类 67 2.3.2 AsyncCallback委托 69 2.3.3 BeginAcceptTcpClient方法和EndAcceptTcpClient方法 70 2.3.4 BeginConnect方法和EndConnect方法 70 2.3.5 发送数据 71 2.3.6 接收数据 72 2.4 异步TCP聊天程序 73 2.4.1 服务器端设计 73 2.4.2 客户端设计 79 2.5 习题2 83 第3章 UDP应用编程 84 3.1 UDP协议基础知识 84 3.2 UDP应用编程技术 84 3.2.1 UdpClient类 84 3.2.2 发送和接收数据的方法 86 3.3 利用UDP协议进行广播和组播 90 3.3.1 通过Internet实现群发功能 90 3.3.2 在Internet上举行网络会议讨论 96 3.4 习题3 101 第4章 P2P应用编程 102 4.1 P2P基础知识 102 4.2 P2P应用举例 104 4.3 习题4 114 第5章 SMTP与POP3应用编程 115 5.1 通过应用程序发送电子邮件 115 5.1.1 SMTP协议 115 5.1.2 发送邮件 116 5.2 利用同步TCP接收电子邮件 120 5.2.1 POP3工作原理 121 5.2.2 邮件接收处理 123 5.3 习题5 127 第6章 网络数据加密与解密 128 6.1 对称加密 128 6.2 不对称加密 133 6.3 通过网络传递加密数据 136 6.4 Hash算法与数字签名 152 6.5 习题6 153 第7章 三维设计与多媒体编程 154 7.1 简单的3D设计入门 154 7.2 DirectX基础知识 160 7.2.1 左手坐标系与右手坐标系 160 7.2.2 设备 160 7.2.3 顶点与顶点缓冲 161 7.2.4 Mesh对象 162 7.2.5 法线 162 7.2.6 纹理与纹理映射 162 7.2.7 世界矩阵、投影矩阵与视图矩阵 162 7.2.8 背面剔除 164 7.3 Primitive 164 7.4 Mesh 171 7.5 灯光与材质 177 7.6 音频与视频 187 7.7 直接使用SoundPlayer类播放WAV音频文件 191 7.8 习题7 193 第8章 上机实验指导 194 8.1 实验一 简单网络聊天系统 194 8.2 实验二 网络呼叫应答提醒系统 195 8.3 实验三 文件数据加密与解密 199
C#中实现TCP户端的断线重连可以通过以下步骤完成: 1. 创建一个TCP客户端对象,并设置相关的参数,如IP地址和端口号。 ```csharp TcpClient client = new TcpClient(); client.Connect(IPAddress.Parse("服务器IP地址"), 服务器端口号); ``` 2. 在一个循环中不断尝试连接服务器,直到连接成功为止。可以使用`while`循环来实现。 ```csharp while (!client.Connected) { try { client.Connect(IPAddress.Parse("服务器IP地址"), 服务器端口号); } catch (Exception ex) { Console.WriteLine("连接失败:" + ex.Message); // 可以添加延时等待一段时间后再尝试连接 Thread.Sleep(1000); } } Console.WriteLine("连接成功!"); ``` 3. 如果连接成功,则可以进行数据传输或其他操作。如果连接断开,可以在循环中进行重连。 ```csharp while (true) { if (!client.Connected) { try { client.Connect(IPAddress.Parse("服务器IP地址"), 服务器端口号); Console.WriteLine("重新连接成功!"); // 连接成功后可以进行数据传输或其他操作 // ... } catch (Exception ex) { Console.WriteLine("重新连接失败:" + ex.Message); // 可以添加延时等待一段时间后再尝试连接 Thread.Sleep(1000); } } } ``` 注意:在实际应用中,可以根据具体需求进行调整和优化,例如添加重试次数限制、重连间隔时间的调整等。另外,为了避免阻塞主线程,可以考虑使用多线程或异步方法进行连接和数据传输操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fanwenhu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值