yantian yue
2023-12-29 fdda48e034b2da82fb100ec04f5b51351477e2bb
提交 | 用户 | 时间
e46d3b 1 using System.Collections;
2 using System.Collections.Generic;
3 using System.Net;
4 using System.Net.Sockets;
5 using System;
6 using System.Text;
7  
8 namespace YX
9 {
10     //规范命名、添加注释、合理封装、限制访问权限    
11     public class AsyncTcpClient
12     {
13         private string ip1;
14         private int port1;
15         byte[] ReadBytes = new byte[1024];
16         //单例
17         TcpClient tcpClient;
18         //连接服务器
19         public void ConnectServer(string ip, int port)
20         {
21             //防止多个事例去重复连接
22             if (isTryingToCon == true)
23             {
24                 return;
25             }
26             ip1 = ip;
27             port1 = port;
28             try
29             {
30                 if (tcpClient != null)
31                 {
32                     tcpClient.Close();
33                 }
34                 tcpClient = new TcpClient();
35                 isTryingToCon = true;
36                 //开始异步
37                 tcpClient.BeginConnect(IPAddress.Parse(ip), port, Lianjie, null);
38             }
39             catch (Exception e)
40             {
41             }
42         }
43         private bool isTryingToCon = false;
44         //连接判断
45         void Lianjie(IAsyncResult ar)
46         {
47             if (IsClose)
48             {
49                 return;
50             }
51             if (tcpClient.Connected == false)
52             {
53                 SetCon(0);
54                 tcpClient.Close();
55                 tcpClient = new System.Net.Sockets.TcpClient();
56                 //尝试重连。。。。。。;
57                 tcpClient.BeginConnect(IPAddress.Parse(ip1), port1, Lianjie, null);
58             }
59             else
60             {
61                 //连接上了
62                 isTryingToCon = false;
63                 //结束异步连接
64                 tcpClient.EndConnect(ar);
65                 //读取数据
66                 tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
67                 SetCon(1);
68             }
69         }
70
71
72         //接收消息
73         void ReceiveCallBack(IAsyncResult ar)
74         {
75             try
76             {
77                 int len = tcpClient.GetStream().EndRead(ar);//结束异步读取
78                 if (len > 0)
79                 {
80                     MyEventArgs e = new MyEventArgs(ip1, ReadBytes);
81                     _MsgChange(e);
82                     //重置数据,防止旧数据残留
83                     ReadBytes = new byte[1024];
84                     tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
85                 }
86                 else
87                 {
88                     //尝试重连。。。。。。"
89                     ConnectServer(ip1, port1);
90                 }
91             }
92             catch (Exception e)
93             {
94             }
95         }
96
97         //发送消息
98         public bool SendMsg(string msg)
99         {
100             try
101             {
102                 //开始异步发送
103                 byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
104                 tcpClient.GetStream().BeginWrite(msgBytes, 0, msgBytes.Length, (ar) =>
105                 {
106                     tcpClient.GetStream().EndWrite(ar);//结束异步发送
107                 }, null);
108                 return true;
109             }
110             catch (Exception ex)
111             {
112                 // int a = ex.NativeErrorCode;
113                 //尝试重连。。。。。。"
114                 ConnectServer(ip1, port1);
115                 return false;
116             }
117         }
118         public bool SendMsg(byte[] msg)
119         {
120             try
121             {
122                 //开始异步发送
123                 tcpClient.GetStream().BeginWrite(msg, 0, msg.Length, (ar) =>
124                 {
125                     tcpClient.GetStream().EndWrite(ar);//结束异步发送
126                 }, null);
127                 return true;
128             }
129             catch (Exception ex)
130             {
131                 //尝试重连。。。。。。"
132                 ConnectServer(ip1, port1);
133                 return false;
134             }
135         }
136         bool IsClose = false;
137         /// <summary>
138         /// 断开连接
139         /// </summary>
140         public void Close()
141         {
142             IsClose = true;
143             if (tcpClient != null && tcpClient.Client.Connected)
144             {
145                 tcpClient.Close();
146             }
147             if (!tcpClient.Client.Connected)
148             {
149                 tcpClient.Close();//断开挂起的异步连接
150             }
151         }
152         int isConnected = -1;
153         /// <summary>
154         /// -1 初始化  0 未连接  1 连接
155         /// </summary>
156         /// <param name="_con"></param>
157         private void SetCon(int _con)
158         {
159             if (isConnected != _con)
160             {
161                 bool rel = false;
162                 if (_con == 1)
163                 {
164                     rel = true;
165                 }
166                 isConnected = _con;
167                 MyEventArgs e = new MyEventArgs(ip1, rel);
168                 _ConChange(e);
169             }
170         }
171
172
173         public class MyEventArgs : EventArgs
174         {
175             public string IP;
176             public bool IsConnetct;
177             public byte[] Msg;
178             public MyEventArgs(string iP, byte[] msg)
179             {
180                 IP = iP;
181                 Msg = msg;
182             }
183             public MyEventArgs(string iP, bool iscon)
184             {
185                 IP = iP;
186                 IsConnetct = iscon;
187             }
188         }
189         //连接状态
190         public delegate void ConChange(object sender, MyEventArgs args);
191         public event ConChange OnConChange;
192         protected virtual void _ConChange(MyEventArgs e)
193         {
194             if (OnConChange != null)
195             {
196                 OnConChange(this, e);
197             }
198         }
199         //收到的消息
200         public delegate void MsgChange(object sender, MyEventArgs args);
201         public event MsgChange OnMsgChange;
202         protected virtual void _MsgChange(MyEventArgs e)
203         {
204             if (OnMsgChange != null)
205             {
206                 OnMsgChange(this, e);
207             }
208         }
209     }
210 }
211
212
213 //调用方法
214
215 //AsyncTcpClient sw = new AsyncTcpClient();
216 //private void Form1_Load(object sender, EventArgs e)
217 //{
218 //    sw.ConnectServer("192.168.1.19", 8000);
219 //    sw.OnConChange += Sw_OnConChange;
220 //    sw.OnMsgChange += Sw_OnMsgChange;
221 //}
222
223 //private void Sw_OnMsgChange(object sender, AsyncTcpClient.MyEventArgs args)
224 //{
225 //    string str = Encoding.UTF8.GetString(args.Msg, 0, args.Msg.Length);
226 //    str = Uri.UnescapeDataString(str);
227 //    Invoke(new MethodInvoker(delegate ()
228 //    {
229 //        label2.Text = args.IP + "___" + str;
230 //    }));
231 //}
232
233 //private void Sw_OnConChange(object sender, AsyncTcpClient.MyEventArgs args)
234 //{
235 //    Invoke(new MethodInvoker(delegate ()
236 //    {
237 //        label1.Text = args.IP + "___" + args.IsConnetct.ToString();
238 //    }));
239 //}
240
241 //private void button1_Click(object sender, EventArgs e)
242 //{
243 //    bool rel = sw.SendMsg("asdf");
244 //    button1.Text = rel.ToString();
245 //}
246
247 //private void Form1_FormClosing(object sender, FormClosingEventArgs e)
248 //{
249 //    sw.OnConChange -= Sw_OnConChange;
250 //    sw.OnMsgChange -= Sw_OnMsgChange;
251 //    sw.Close();
252 //}