using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace SocketHelper { public partial class AxTcpClient : Component { #region 构造函数 public AxTcpClient() { InitializeComponent(); } public AxTcpClient(IContainer container) { container.Add(this); InitializeComponent(); } #endregion #region 属性 /// /// 服务端IP /// private string _serverip; [Description("服务端IP")] [Category("TcpClient属性")] public string ServerIp { set { _serverip = value; } get { return _serverip; } } /// /// 服务端监听端口 /// private int _serverport; [Description("服务端监听端口")] [Category("TcpClient属性")] public int ServerPort { set { _serverport = value; } get { return _serverport; } } /// /// TcpClient客户端 /// private TcpClient _tcpclient = null; [Description("TcpClient操作类")] [Category("TcpClient隐藏属性")] [Browsable(false)] public TcpClient Tcpclient { set { _tcpclient = value; } get { return _tcpclient; } } /// /// Tcp客户端连接线程 /// private Thread _tcpthread = null; [Description("TcpClient连接服务端线程")] [Category("TcpClient隐藏属性")] [Browsable(false)] public Thread Tcpthread { set { _tcpthread = value; } get { return _tcpthread; } } /// /// 是否启动Tcp连接线程 /// private bool _isStarttcpthreading = false; [Description("是否启动Tcp连接线程")] [Category("TcpClient隐藏属性")] [Browsable(false)] public bool IsStartTcpthreading { set { _isStarttcpthreading = value; } get { return _isStarttcpthreading; } } /// /// 是否启动TCP /// public bool IsStart = false; /// /// 是否重连 /// private bool _isreconnection = false; /// /// 是否重连 /// [Description("是否重连")] [Category("TcpClient属性")] public bool IsReconnection { set { _isreconnection = value; } get { return _isreconnection; } } private int _reConnectionTime = 3000; /// /// 设置断开重连时间间隔单位(毫秒)(默认3000毫秒) /// [Description("设置断开重连时间间隔单位(毫秒)(默认3000毫秒)")] [Category("TcpClient属性")] public int ReConnectionTime { get { return _reConnectionTime; } set { _reConnectionTime = value; } } private string _receivestr; /// /// 接收Socket数据包 缓存字符串 /// [Description("接收Socket数据包 缓存字符串")] [Category("TcpClient隐藏属性"), Browsable(false)] public string Receivestr { set { _receivestr = value; } get { return _receivestr; } } /// /// 重连次数 /// private int _reConectedCount = 0; [Description("重连次数")] [Category("TcpClient隐藏属性"), Browsable(false)] public int ReConectedCount { get { return _reConectedCount; } set { _reConectedCount = value; } } #endregion #region 方法 /// /// 启动连接Socket服务器 /// public void StartConnection() { try { IsStart = true; IsReconnection = true; CreateTcpClient(); } catch (Exception ex) { OnTcpClientErrorMsgEnterHead("错误信息:" + ex.Message); } } /// /// 创建线程连接 /// private void CreateTcpClient() { //如果已经启动TCP并且是可重连状态则继续连接 if (!(IsReconnection && IsStart)) return; //标示已启动连接,防止重复启动线程 IsReconnection = false; IsStartTcpthreading = true; Tcpclient = new TcpClient(); Tcpthread = new Thread(StartTcpThread); IsOnlienCheckStart(); Tcpthread.Start(); } /// /// 线程接收Socket上传的数据 /// private void StartTcpThread() { byte[] receivebyte = new byte[2048]; int bytelen; try { while (IsStartTcpthreading) { #region if (!Tcpclient.Connected) { try { if (ReConectedCount != 0) { //返回状态信息 OnTcpClientStateInfoEnterHead( string.Format("正在第{0}次重新连接服务器... ...", ReConectedCount), SocketState.Reconnection); } else { //SocketStateInfo OnTcpClientStateInfoEnterHead("正在连接服务器... ...", SocketState.Connecting); } Tcpclient.Connect(IPAddress.Parse(ServerIp), ServerPort); OnTcpClientStateInfoEnterHead("已连接服务器", SocketState.Connected); //Tcpclient.Client.Send(Encoding.Default.GetBytes("login")); } catch { //连接失败 ReConectedCount++; //强制重新连接 IsReconnection = true; IsStartTcpthreading = false; //每三秒重连一次 Thread.Sleep(ReConnectionTime); continue; } } //Tcpclient.Client.Send(Encoding.Default.GetBytes("login")); bytelen = Tcpclient.Client.Receive(receivebyte); // 连接断开 if (bytelen == 0) { //返回状态信息 OnTcpClientStateInfoEnterHead("与服务器断开连接... ...", SocketState.Disconnect); // 异常退出、强制重新连接 IsReconnection = true; ReConectedCount = 1; IsStartTcpthreading = false; continue; } Receivestr = ASCIIEncoding.Default.GetString(receivebyte, 0, bytelen); byte[] bytes = new byte[bytelen]; Array.Copy(receivebyte, 0, bytes, 0, bytelen); //OnTcpClientRecevice(bytes); if (Receivestr.Trim() != "") { //接收数据 try { OnTcpClientRecevice(Receivestr, bytes); } catch (Exception ex) { //返回错误信息 OnTcpClientErrorMsgEnterHead("错误信息:" + ex.Message); } } #endregion } //此时线程将结束,人为结束,自动判断是否重连 IsReconnection = true; CreateTcpClient(); } catch (Exception ex) { IsReconnection = true; CreateTcpClient(); //返回错误信息 try { OnTcpClientErrorMsgEnterHead("错误信息:" + ex.Message); } catch { } } } /// /// 断开连接 /// public void StopConnection() { IsStart = false; IsReconnection = false; IsStartTcpthreading = false; Thread.Sleep(10); if (Tcpclient != null) { //关闭连接 Tcpclient.Close(); } if (Tcpthread != null) { Tcpthread.Interrupt(); //关闭线程 Tcpthread.Abort(); //Tcpthread = null; } OnTcpClientStateInfoEnterHead("断开连接", SocketState.Disconnect); //标示线程已关闭可以重新连接 } /// /// 发送Socket文本消息 /// /// 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) { //返回错误信息 OnTcpClientErrorMsgEnterHead(ex.Message); } } public void SendFile(string filename) { Tcpclient.Client.BeginSendFile(filename, new AsyncCallback(SendCallback), Tcpclient); //Tcpclient.Client.SendFile(filename); } private void SendCallback(IAsyncResult result) { try { TcpClient tc = (TcpClient)result.AsyncState; // Complete sending the data to the remote device. tc.Client.EndSendFile(result); } catch (SocketException ex) { } } /// /// 发送Socket消息 /// /// public void SendCommand(byte[] byteMsg) { try { Tcpclient.Client.Send(byteMsg); } catch (Exception ex) { //返回错误信息 OnTcpClientErrorMsgEnterHead("错误信息:" + ex.Message); } } // 检查一个Socket是否可连接 public bool IsOnline() { return !((Tcpclient.Client.Poll(1000, SelectMode.SelectRead) && (Tcpclient.Client.Available == 0)) || !Tcpclient.Client.Connected); } public void IsOnlienCheckThread() { while (IsReconnection) { if (IsOnline()) { IsStartTcpthreading = false; } } } public void IsOnlienCheckStart() { Thread t = new Thread(new ThreadStart(IsOnlienCheckThread)); t.Start(); } #endregion #region 事件 #region OnRecevice接收数据事件 public delegate void ReceviceEventHandler(string msg, byte[] data); [Description("接收数据事件")] [Category("TcpClient事件")] public event ReceviceEventHandler OnRecevice; protected virtual void OnTcpClientRecevice(string msg, byte[] data) { if (OnRecevice != null) OnRecevice(msg, data); } #endregion #region OnErrorMsg返回错误消息事件 public delegate void ErrorMsgEventHandler(string msg); [Description("返回错误消息事件")] [Category("TcpClient事件")] public event ErrorMsgEventHandler OnErrorMsg; protected virtual void OnTcpClientErrorMsgEnterHead(string msg) { if (OnErrorMsg != null) OnErrorMsg(msg); } #endregion #region OnStateInfo连接状态改变时返回连接状态事件 public delegate void StateInfoEventHandler(string msg, SocketState state); [Description("连接状态改变时返回连接状态事件")] [Category("TcpClient事件")] public event StateInfoEventHandler OnStateInfo; protected virtual void OnTcpClientStateInfoEnterHead(string msg, SocketState state) { if (OnStateInfo != null) OnStateInfo(msg, state); } #endregion #endregion } }