在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例常用C#方法 → C# TCP/UDP/ 实例源码下载(SocketHelper)

C# TCP/UDP/ 实例源码下载(SocketHelper)

常用C#方法

下载此实例
  • 开发语言:C#
  • 实例大小:0.42M
  • 下载次数:19
  • 浏览次数:66
  • 发布时间:2017-01-11
  • 实例类别:常用C#方法
  • 发 布 人:alexshi1979
  • 所需积分:1
 相关标签: Socket

实例介绍

【实例简介】SocketHelper C# SocketHelper通讯类

【实例截图】

【核心代码】


#region 说明
/* 简介:Socket通讯客户端实现网络通讯
 * 功能介绍:Socket通讯客户端实现网络通讯,支持断开重连。
 * socket客户端封装类的调用三步:
 * 1、初始化:
 * string ip="127.0.0.1";
 * int port=5100;
 * TCPClient_tcpClient = new TCPClient(ip,port);
 * 
 * 2、创建委托接收数据方法并绑定(可根据需求定义),此类暂时定义了四种接收数据的委托:返回接收客户端的数据,返回客户端连接状态和监听状态,返回错误信息,返回客户端数量的委托
 * 
 * ①申明返回接收数据的委托方法
 * DelegateHelper.TcpServerReceive= 自定义方法;
 * 
 * ②申明返回状态信息的委托方法
 * DelegateHelper.TcpServerStateInfo= 自定义方法;
 * 
 * ③申明返回错误信息的委托方法
 * DelegateHelper.TcpServerErrorMsg = 自定义方法;
 * 
 * 
 * 3、启动和关闭方法:
 * TCPCliet.StartConnection();
 * TCPCliet.StopConnection();
  */
#endregion
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SocketHelper
{
    public class TCPClient
    {
        #region 属性
        private string _serverip;
        /// <summary>
        /// 服务端IP
        /// </summary>
        public string ServerIp
        {
            set { _serverip = value; }
            get { return _serverip; }
        }
        private int _serverport;
        /// <summary>
        /// 服务端监听端口
        /// </summary>
        public int ServerPort
        {
            set { _serverport = value; }
            get { return _serverport; }
        }
        private TcpClient _tcpclient = null;
        /// <summary>
        /// TcpClient客户端
        /// </summary>
        public TcpClient Tcpclient
        {
            set { _tcpclient = value; }
            get { return _tcpclient; }
        }
        private Thread _tcpthread = null;
        /// <summary>
        /// Tcp客户端连接线程
        /// </summary>
        public Thread Tcpthread
        {
            set { _tcpthread = value; }
            get { return _tcpthread; }
        }
        private bool _isStarttcpthreading = false;
        /// <summary>
        /// 是否启动Tcp连接线程
        /// </summary>
        public bool IsStartTcpthreading
        {
            set { _isStarttcpthreading = value; }
            get { return _isStarttcpthreading; }
        }
        private bool _isclosed=false;
        /// <summary>
        /// 连接是否关闭(用来断开重连)
        /// </summary>
        public bool Isclosed
        {
            set { _isclosed = value; }
            get { return _isclosed; }
        }

        private int _reConnectionTime = 3000;
        /// <summary>
        /// 设置断开重连时间间隔单位(毫秒)(默认3000毫秒)
        /// </summary>
        public int ReConnectionTime {
            get { return _reConnectionTime; }
            set { _reConnectionTime = value; }
        }
        private string _receivestr;
        /// <summary>
        ///  接收Socket数据包 缓存字符串
        /// </summary>
        public string Receivestr
        {
            set { _receivestr = value; }
            get { return _receivestr; }
        }
        /// <summary>
        /// 重连次数
        /// </summary>
        private int _reConectedCount = 0;
        public int ReConectedCount {
            get { return _reConectedCount; }
            set { _reConectedCount = value; }
        }

        #endregion

        #region 方法
        /// <summary>
        /// 十六进制字字符串转为节数组
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static byte[] StringToHexByteArray(string s)
        {
            s = s.Replace(" ", "");
            if ((s.Length % 2) != 0)
                s = " ";
            byte[] returnBytes = new byte[s.Length / 2];
            for (int i = 0; i < returnBytes.Length; i )
                returnBytes[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
            return returnBytes;
        }
        /// <summary>
        /// 启动连接Socket服务器
        /// </summary>
        public void StartConnection()
        {
            try
            {
                //Isclosed = false;
                CreateTcpClient();
            }
            catch (Exception ex)
            {
                DelegateHelper.TcpClientErrorMsg("错误信息:" ex.Message);
            }
        }
        /// <summary>
        /// 创建线程连接
        /// </summary>
        private void CreateTcpClient()
        {

            if (Isclosed)
                return;
            //标示已启动连接,防止重复启动线程
            Isclosed = true;
            Tcpclient = new TcpClient();
            Tcpthread = new Thread(StartTcpThread);
            IsStartTcpthreading = true;
            Tcpthread.Start();
        }
        /// <summary>
        ///  线程接收Socket上传的数据
        /// </summary>
        private void StartTcpThread()
        {
            byte[] receivebyte = new byte[1024];
            int bytelen;
            try
            {
                while (IsStartTcpthreading)
                #region 
                {
                    if (!Tcpclient.Connected)
                    {
                        try
                        {
                            if (ReConectedCount != 0)
                            {
                                //返回状态信息
                                DelegateHelper.TcpClientStateInfo(string.Format("正在第{0}次重新连接服务器... ...", ReConectedCount), EnumClass.SocketState.Reconnection);
                            }
                            else
                            {
                                //SocketStateInfo
                                DelegateHelper.TcpClientStateInfo("正在连接服务器... ...", EnumClass.SocketState.Connecting);
                            }
                            Tcpclient.Connect(IPAddress.Parse(ServerIp), ServerPort);
                            DelegateHelper.TcpClientStateInfo("已连接服务器",EnumClass.SocketState.Connected);
                            //Tcpclient.Client.Send(Encoding.Default.GetBytes("login"));
                        }
                        catch
                        {
                            //连接失败
                            ReConectedCount ;
                            //强制重新连接
                            Isclosed = false;
                            IsStartTcpthreading = false;
                            //每三秒重连一次
                            Thread.Sleep(ReConnectionTime);
                            continue;
                        }
                    }
                    //Tcpclient.Client.Send(Encoding.Default.GetBytes("login"));
                    bytelen = Tcpclient.Client.Receive(receivebyte);
                    // 连接断开
                    if (bytelen == 0)
                    {
                        //返回状态信息
                        DelegateHelper.TcpClientStateInfo("与服务器断开连接... ...",EnumClass.SocketState.Disconnect);
                        // 异常退出、强制重新连接
                        Isclosed = false;
                        ReConectedCount = 1;
                        IsStartTcpthreading = false;
                        continue;
                    }
                    Receivestr = ASCIIEncoding.Default.GetString(receivebyte, 0, bytelen);
                    if (Receivestr.Trim() != "")
                    {
                        //接收数据
                        DelegateHelper.TcpClientReceive(Receivestr);
                    }
                } 
                #endregion
                //此时线程将结束,人为结束,自动判断是否重连
                CreateTcpClient();
            }
            catch (Exception ex)
            {
                //CreateTcpClient();
                //返回错误信息
                DelegateHelper.TcpClientErrorMsg("错误信息:" ex.Message);
            }
        }
        /// <summary>
        /// 断开连接
        /// </summary>
        public void StopConnection()
        {
           
            IsStartTcpthreading = false;
            Isclosed = false;
            
            //关闭连接
            Tcpclient.Close();
            Tcpthread.Interrupt();
            //关闭线程
            Tcpthread.Abort();
            //Tcpthread = null;
            
            
            DelegateHelper.TcpClientStateInfo("断开连接",EnumClass.SocketState.Disconnect);
            //标示线程已关闭可以重新连接
        }

        /// <summary>
        /// 发送Socket消息
        /// </summary>
        /// <param name="cmdstr"></param>
        public void SendCommand(string cmdstr)
        {
            try
            {
                //byte[] _out=Encoding.GetEncoding("GBK").GetBytes(cmdstr);
                byte[] _out = Encoding.Default.GetBytes(cmdstr);
                Tcpclient.Client.Send(_out);
            }
            catch (Exception ex)
            {
                //返回错误信息
                DelegateHelper.TcpClientErrorMsg(ex.Message);
            }
        }
        /// <summary>
        /// 发送Socket消息
        /// </summary>
        /// <param name="byteMsg"></param>
        public void SendCommand(byte[] byteMsg)
        {
            try
            {
                Tcpclient.Client.Send(byteMsg);
            }
            catch (Exception ex)
            {
                //返回错误信息
                DelegateHelper.TcpClientErrorMsg("错误信息:" ex.Message);
            }
        }
        #endregion

        #region 构造函数
        /// <summary>
        /// 初始化TCPClient类
        /// </summary>
        /// <param name="ip">服务端IP</param>
        /// <param name="port">监听端口</param>
        public TCPClient(string ip, int port)
        {
            if (DelegateHelper.TcpClientReceive == null)
            {
                DelegateHelper.TcpClientReceive = DelegateHelper.BaseVoid;
            }
            if (DelegateHelper.TcpClientErrorMsg == null)
            {
                DelegateHelper.TcpClientErrorMsg = DelegateHelper.BaseVoid;
            }
            if (DelegateHelper.TcpClientStateInfo == null)
            {
                DelegateHelper.TcpClientStateInfo = DelegateHelper.BaseVoid;
            }
            ServerIp = ip;
            ServerPort = port;
        } 
        #endregion
    }
}



标签: Socket

实例下载地址

C# TCP/UDP/ 实例源码下载(SocketHelper)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 lf8013 发表于: 2017-02-04 15:51 06
这个代码好,可以正常运行,正是我在找的,谢谢了

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
;
报警