using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System; using System.Text; namespace YX { //规范命名、添加注释、合理封装、限制访问权限 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; /// /// 断开连接 /// public void Close() { IsClose = true; if (tcpClient != null && tcpClient.Client.Connected) { tcpClient.Close(); } if (!tcpClient.Client.Connected) { tcpClient.Close();//断开挂起的异步连接 } } int isConnected = -1; /// /// -1 初始化 0 未连接 1 连接 /// /// 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(); //}