using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace SocketHelper { public class TCPClient { #region 属性 private string _serverip; /// /// 服务端IP /// public string ServerIp { set { _serverip = value; } get { return _serverip; } } private int _serverport; /// /// 服务端监听端口 /// public int ServerPort { set { _serverport = value; } get { return _serverport; } } private TcpClient _tcpclient = null; /// /// TcpClient客户端 /// public TcpClient Tcpclient { set { _tcpclient = value; } get { return _tcpclient; } } private Thread _tcpthread = null; /// /// Tcp客户端连接线程 /// public Thread Tcpthread { set { _tcpthread = value; } get { return _tcpthread; } } private bool _isStarttcpthreading = false; /// /// 是否启动Tcp连接线程 /// public bool IsStartTcpthreading { set { _isStarttcpthreading = value; } get { return _isStarttcpthreading; } } private bool _isclosed; /// /// 连接是否关闭 /// public bool Isclosed { set { _isclosed = value; } get { return _isclosed; } } private string _receivestr; /// /// 接收Socket数据包 缓存字符串 /// public string Receivestr { set { _receivestr = value; } get { return _receivestr; } } /// /// 重连次数 /// private int _reConectedCount = 0; public int ReConectedCount { get { return _reConectedCount; } set { _reConectedCount = value; } } #endregion #region 方法 /// /// 十六进制字字符串转为节数组 /// /// /// 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; } /// /// 启动连接Socket服务器 /// public void StartConnection() { try { Isclosed = false; CreateTcpClient(); } catch (Exception ex) { //LogHelper.WriteLog(ex.Message); DelegateHelper.SocketInfo("错误信息:" + ex.Message); } } /// /// 创建线程连接 /// private void CreateTcpClient() { if (Isclosed) return; Tcpclient = new TcpClient(); Tcpthread = new Thread(StartTcpThread); IsStartTcpthreading = true; Tcpthread.Start(); } /// /// 线程接收Socket上传的数据 /// private void StartTcpThread() { byte[] receivebyte = new byte[128]; int bytelen; try { while (IsStartTcpthreading) { if (!Tcpclient.Connected) { try { if (ReConectedCount != 0) { DelegateHelper.SocketInfo(string.Format("正在第{0}次重新连接FMS服务器... ...", ReConectedCount)); } else { DelegateHelper.SocketInfo("正在连接FMS服务器... ..."); } Tcpclient.Connect(IPAddress.Parse(ServerIp), ServerPort); DelegateHelper.SocketInfo("已连接FMS服务器"); } catch { //连接失败 ReConectedCount++; IsStartTcpthreading = false; Thread.Sleep(3000); continue; } } bytelen = Tcpclient.Client.Receive(receivebyte); // 连接断开 if (bytelen == 0) { DelegateHelper.SocketInfo("与服务器断开连接... ..."); ReConectedCount = 1; IsStartTcpthreading = false; continue; } Receivestr = ASCIIEncoding.Default.GetString(receivebyte, 0, bytelen); if (Receivestr.Trim() != "") { //接收数据 DelegateHelper.SocketReceive(Receivestr); } } CreateTcpClient(); } catch (Exception ex) { // 异常退出时、需要重新连接 CreateTcpClient(); DelegateHelper.SocketInfo("错误信息:" + ex.Message); } } /// /// 发送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) { throw ex; } } /// /// 发送Socket消息 /// /// public void SendCommand(byte[] byteMsg) { try { Tcpclient.Client.Send(byteMsg); } catch (Exception ex) { DelegateHelper.SocketInfo("错误信息:" + ex.Message); } } #endregion public void Close() { try { if (Tcpclient.Client.Connected) { Tcpclient.Client.Close(); Tcpclient.Client.Disconnect(true); } } catch (Exception ex) { DelegateHelper.SocketInfo("错误信息:" + ex.Message); } } #region 构造函数 /// /// 初始化TCPClient类 /// /// 服务端IP /// 监听端口 public TCPClient(string ip, int port) { ServerIp = ip; ServerPort = port; } #endregion } }