前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Socket一些常用的方法封装

Socket一些常用的方法封装

作者头像
冰封一夏
发布2019-09-11 15:33:43
5220
发布2019-09-11 15:33:43
举报
代码语言:javascript
复制
  1  public class SocketHelper
  2     {
  3         /// <summary>
  4         /// 功能描述:得到一个实例对象
  5         /// </summary>
  6         /// <returns>SocketHelper</returns>
  7         public static SocketHelper GetSocketHelper()
  8         {
  9             try
 10             {
 11                 return new SocketHelper();
 12             }
 13             catch
 14             {
 15                 throw;
 16             }
 17         }
 18         /// <summary>
 19         /// 委托
 20         /// </summary>
 21         /// <param name="intport">intport</param>
 22         /// <param name="strmsg">strmsg</param>
 23         public delegate void RecvGBDelegate(int intport, string strmsg);
 24         /// <summary>
 25         /// 监听到广播事件
 26         /// </summary>
 27         public event RecvGBDelegate OnRecvGBMessageChanged;
 28 
 29         /// <summary>
 30         /// 功能描述:监听广播,使用线程调用
 31         /// 作  者:huangzh
 32         /// 创建日期:2015-08-17 10:28:19
 33         /// 任务编号:
 34         /// </summary>
 35         /// <param name="objport">监听端口</param>
 36         public void RecvUDPGB(object objport)
 37         {
 38             UdpClient client = null;
 39             try
 40             {
 41                 if (!(objport is int))
 42                 {
 43                     throw new Exception("参数不是int类型");
 44                 }
 45                 int intport = Convert.ToInt32(objport);
 46                 client = new UdpClient(new IPEndPoint(IPAddress.Any, intport));
 47                 IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
 48                 while (true)
 49                 {
 50                     byte[] buf = client.Receive(ref endpoint);
 51                     string strmsg = Encoding.UTF8.GetString(buf);
 52                     if (strmsg.IndexOf("CloseClient") >= 0)
 53                         break;
 54                     OnRecvGBMessageChanged(intport, strmsg);
 55                 }
 56             }
 57             catch
 58             {
 59                 throw;
 60             }
 61             finally
 62             {
 63                 if (client != null)
 64                     client.Close();
 65             }
 66         }
 67 
 68         /// <summary>
 69         /// 功能描述:发送广播
 70         /// </summary>
 71         /// <param name="strmsg">strmsg</param>
 72         /// <param name="intport">intport</param>
 73         public void SendUDPGB(string strmsg, int intport)
 74         {
 75             try
 76             {
 77                 SendUDPGB(Encoding.UTF8.GetBytes(strmsg), intport);
 78             }
 79             catch
 80             {
 81                 throw;
 82             }
 83         }
 84 
 85         /// <summary>
 86         /// 功能描述:发送广播
 87         /// </summary>
 88         /// <param name="buf">buf</param>
 89         /// <param name="intport">intport</param>
 90         public void SendUDPGB(byte[] buf, int intport)
 91         {
 92             UdpClient client = null;
 93             try
 94             {
 95                 client = new UdpClient(new IPEndPoint(IPAddress.Any, 0));
 96                 IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), intport);
 97                 client.Send(buf, buf.Length, endpoint);
 98 
 99             }
100             catch
101             {
102                 throw;
103             }
104             finally
105             {
106                 if (client != null)
107                 {
108                     client.Close();
109                 }
110             }
111         }
112 
113 
114         /// <summary>
115         /// 功能描述:接收文件
116         /// </summary>
117         /// <param name="intport">intport</param>
118         /// <param name="strApplicationPath">strApplicationPath</param>
119         /// <returns>返回值</returns>
120         public bool RecvFile(int intport, string strApplicationPath)
121         {
122             Socket server = null;
123             Socket client = null;
124             try
125             {
126                 //创建一个网络端点  
127                 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, intport);
128 
129                 //创建一个套接字  
130                 server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
131 
132                 //绑定套接字到端口  
133                 server.Bind(ipep);
134 
135                 //开始侦听(并堵塞该线程)  
136                 server.Listen(10);
137 
138                 //确认连接  
139                 client = server.Accept();
140 
141                 //获得客户端节点对象  
142                 IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
143 
144                 //获得[文件名]  
145                 string strSendFileName = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
146                 //获得[保存位置]
147                 string strSavePath = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
148                 strSendFileName = strApplicationPath + "\\" + (string.IsNullOrEmpty(strSavePath) ? "" : (strSavePath + "\\")) + strSendFileName;
149                 string strdir = Path.GetDirectoryName(strSendFileName);
150                 if (!Directory.Exists(strdir))
151                 {
152                     Directory.CreateDirectory(strdir);
153                 }
154                 //获得[包的大小]  
155                 string strbagSize = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
156                 //MessageBox.Show("包大小" + bagSize);  
157 
158                 //获得[包的总数量]  
159                 int intbagCount = int.Parse(System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client)));
160                 //MessageBox.Show("包的总数量" + bagCount);  
161 
162                 //获得[最后一个包的大小]  
163                 string strbagLast = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
164                 //MessageBox.Show("最后一个包的大小" + bagLast);  
165 
166                 //创建一个新文件  
167                 using (FileStream myFileStream = new FileStream(strSendFileName, FileMode.Create, FileAccess.Write))
168                 {
169                     //已发送包的个数  
170                     int intSendedCount = 0;
171 
172                     while (true)
173                     {
174                         byte[] data = TransferFiles.ReceiveVarData(client);
175                         if (data.Length == 0)
176                         {
177                             break;
178                         }
179                         else
180                         {
181                             intSendedCount++;
182                             //将接收到的数据包写入到文件流对象  
183                             myFileStream.Write(data, 0, data.Length);
184                             //显示已发送包的个数  
185                             //MessageBox.Show("已发送包个数"+SendedCount.ToString());  
186                         }
187                     }
188                 }
189             }
190             catch
191             {
192                 throw;
193             }
194             finally
195             {
196                 //关闭套接字 
197                 if (client != null)
198                     client.Close();
199                 if (server != null)
200                     server.Close();
201 
202             }
203             return true;
204         }
205 
206 
207         /// <summary>
208         /// 功能描述:发送文件
209         /// </summary>
210         /// <param name="strfile">文件路径</param>
211         /// <param name="strDirName">发布相对位置</param>
212         /// <param name="toip">目标ip</param>
213         /// <param name="inttoPort">目标端口</param>
214         public void SendFile(
215             string strfile,
216             string strDirName,
217             IPAddress toip,
218             int inttoPort)
219         {
220             Socket client = null;
221             try
222             {
223                 //创建一个文件对象  
224                 FileInfo ezoneFile = new FileInfo(strfile);
225                 //打开文件流  
226                 using (FileStream ezoneStream = ezoneFile.OpenRead())
227                 {
228                     //包的大小  
229                     int intPacketSize = 50000;
230                     //包的数量  
231                     int intPacketCount = (int)(ezoneStream.Length / ((long)intPacketSize));
232                     //this.textBox8.Text=PacketCount.ToString();  
233                     //this.progressBar1.Maximum=PacketCount;  
234                     //最后一个包的大小  
235                     int intLastDataPacket = (int)(ezoneStream.Length - ((long)(intPacketSize * intPacketCount)));
236 
237 
238                     //指向远程服务端节点  
239                     IPEndPoint ipep = new IPEndPoint(toip, inttoPort);
240                     //创建套接字  
241                     client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
242                     //连接到发送端  
243                     client.Connect(ipep);
244 
245                     //获得客户端节点对象  
246                     IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
247                     //获得客户端的IP地址  
248                     //this.textBox7.Text=clientep.Address.ToString();  
249                     //发送[文件名]到客户端  
250                     TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(ezoneFile.Name));
251                     //发送[保存位置]到客户端  
252                     strDirName = strDirName.Trim(new char[] { '\\' });
253                     TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(strDirName));
254                     //发送[包的大小]到客户端  
255                     TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(intPacketSize.ToString()));
256                     //发送[包的总数量]到客户端  
257                     TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(intPacketCount.ToString()));
258                     //发送[最后一个包的大小]到客户端  
259                     TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(intLastDataPacket.ToString()));
260 
261                     //数据包  
262                     byte[] data = new byte[intPacketSize];
263                     //开始循环发送数据包  
264                     for (int i = 0; i < intPacketCount; i++)
265                     {
266                         //从文件流读取数据并填充数据包  
267                         ezoneStream.Read(data, 0, data.Length);
268                         //发送数据包  
269                         TransferFiles.SendVarData(client, data);
270                         ////显示发送数据包的个数  
271                         //this.textBox10.Text=((int)(i+1)).ToString();  
272                         ////进度条值的显示  
273                         //this.progressBar1.PerformStep();  
274                     }
275 
276                     //如果还有多余的数据包,则应该发送完毕!  
277                     if (intLastDataPacket != 0)
278                     {
279                         data = new byte[intLastDataPacket];
280                         ezoneStream.Read(data, 0, data.Length);
281                         TransferFiles.SendVarData(client, data);
282                         //  this.progressBar1.Value=this.progressBar1.Maximum;  
283                     }
284                 }
285             }
286             catch
287             {
288                 throw;
289             }
290             finally
291             {
292                 if (client != null)
293                     client.Close();
294             }
295         }
296 
297         /// <summary>
298         /// 功能描述:发送信息
299         /// </summary>
300         /// <param name="ip">ip</param>
301         /// <param name="intport">intport</param>
302         /// <param name="strmsg">msg</param>
303         public void SendMsg(
304             IPAddress ip,
305             int intport,
306             string strmsg)
307         {
308             UdpClient uc = null;
309             try
310             {
311                 byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strmsg);
312                 uc = new UdpClient();
313                 uc.Send(bytes, bytes.Length, ip.ToString(), intport);
314 
315             }
316             catch
317             {
318                 throw;
319             }
320             finally
321             {
322                 if (uc != null)
323                 {
324                     uc.Close();
325                 }
326             }
327         }
328         /// <summary>
329         /// 监听委托
330         /// </summary>
331         /// <param name="strmsg">strmsg</param>
332         public delegate void RecvMsgDelegate(string strmsg);
333         /// <summary>
334         /// 监听事件
335         /// </summary>
336         public event RecvMsgDelegate OnRecvMsg;
337 
338         /// <summary>
339         /// 功能描述:接收信息     
340         /// </summary>
341         /// <param name="objport">objport</param>    
342         public void RecvMsg(object objport)
343         {
344             if (!(objport is int))
345             {
346                 throw new Exception("参数不是int类型");
347             }
348             int intport = Convert.ToInt32(objport);
349             UdpClient uc = null;
350             try
351             {
352                 uc = new UdpClient(intport);
353                 IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
354                 while (true)
355                 {
356                     string strtext = System.Text.Encoding.UTF8.GetString(uc.Receive(ref iep));
357                     if (strtext == "Close")
358                         break;
359                     OnRecvMsg(strtext);
360                 }
361                 uc.Close();
362             }
363             catch
364             {
365                 throw;
366             }
367             finally
368             {
369                 if (uc != null)
370                 {
371                     uc.Close();
372                 }
373             }
374         }
375 
376        
377         public IPAddress GetThisIPAddress()
378         {
379             try
380             {
381                 string strhostName = Dns.GetHostName();
382                 IPAddress[] addressList = Dns.GetHostAddresses(strhostName);
383                 IPAddress thisIp = null;
384                 foreach (IPAddress item in addressList)
385                 {
386                     if (item.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
387                     {
388                         thisIp = item;
389                         break;
390                     }
391                 }
392                 return thisIp;
393             }
394             catch
395             {
396                 throw;
397             }
398         }
399     }
代码语言:javascript
复制
  1  public class TransferFiles
  2     {
  3         /// <summary>
  4         /// 功能描述:发送数据
  5         /// </summary>
  6         /// <param name="s">s</param>
  7         /// <param name="data">data</param>
  8         /// <returns>返回值</returns>
  9         public static int SendData(Socket s, byte[] data)
 10         {
 11             int inttotal = 0;
 12             int intsize = data.Length;
 13             int intdataleft = intsize;
 14             int intsent;
 15 
 16             while (inttotal < intsize)
 17             {
 18                 intsent = s.Send(data, inttotal, intdataleft, SocketFlags.None);
 19                 inttotal += intsent;
 20                 intdataleft -= intsent;
 21             }
 22 
 23             return inttotal;
 24         }
 25 
 26         /// <summary>
 27         /// 功能描述:接收数据
 28         /// </summary>
 29         /// <param name="s">s</param>
 30         /// <param name="intsize">size</param>
 31         /// <returns>返回值</returns>
 32         public static byte[] ReceiveData(Socket s, int intsize)
 33         {
 34             int inttotal = 0;
 35             int intdataleft = intsize;
 36             byte[] data = new byte[intsize];
 37             int intrecv;
 38             while (inttotal < intsize)
 39             {
 40                 intrecv = s.Receive(data, inttotal, intdataleft, SocketFlags.None);
 41                 if (intrecv == 0)
 42                 {
 43                     data = null;
 44                     break;
 45                 }
 46 
 47                 inttotal += intrecv;
 48                 intdataleft -= intrecv;
 49             }
 50             return data;
 51         }
 52 
 53         /// <summary>
 54         /// 功能描述:发送数据
 55         /// </summary>
 56         /// <param name="s">s</param>
 57         /// <param name="data">data</param>
 58         /// <returns>返回值</returns>
 59         public static int SendVarData(Socket s, byte[] data)
 60         {
 61             int inttotal = 0;
 62             int intsize = data.Length;
 63             int intdataleft = intsize;
 64             int intsent;
 65             byte[] datasize = new byte[4];
 66             datasize = BitConverter.GetBytes(intsize);
 67             intsent = s.Send(datasize);
 68 
 69             while (inttotal < intsize)
 70             {
 71                 intsent = s.Send(data, inttotal, intdataleft, SocketFlags.None);
 72                 inttotal += intsent;
 73                 intdataleft -= intsent;
 74             }
 75 
 76             return inttotal;
 77         }
 78 
 79         /// <summary>
 80         /// 功能描述:接收数据
 81         /// </summary>
 82         /// <param name="s">s</param>
 83         /// <returns>返回值</returns>
 84         public static byte[] ReceiveVarData(Socket s)
 85         {
 86             int inttotal = 0;
 87             int intrecv;
 88             byte[] datasize = new byte[4];
 89             intrecv = s.Receive(datasize, 0, 4, SocketFlags.None);
 90             int intsize = BitConverter.ToInt32(datasize, 0);
 91             int intdataleft = intsize;
 92             byte[] data = new byte[intsize];
 93             while (inttotal < intsize)
 94             {
 95                 intrecv = s.Receive(data, inttotal, intdataleft, SocketFlags.None);
 96                 if (intrecv == 0)
 97                 {
 98                     data = null;
 99                     break;
100                 }
101                 inttotal += intrecv;
102                 intdataleft -= intrecv;
103             }
104             return data;
105         }
106     }

包含了:广播,消息,发送文件等

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档