zoukankan      html  css  js  c++  java
  • Socket一些常用的方法封装

      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     }
      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     }

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

  • 相关阅读:
    SpringMVC的入门示例
    [PTA] 数据结构与算法题目集 6-1 单链表逆转
    [PTA] L3-015 球队“食物链”
    [PTA] 1001. 害死人不偿命的(3n+1)猜想 (Basic)
    [PTA] 1002. 写出这个数 (Basic)
    [opengl] 画一个可移动的自行车 二维几何变换(平移、旋转、缩放)
    css inline-block 水平居中
    css 图片裁剪显示
    [leetcode] 19. Remove Nth Node From End of List (Medium)
    [leetcode] 20. Valid Parentheses (easy)
  • 原文地址:https://www.cnblogs.com/bfyx/p/4759336.html
Copyright © 2011-2022 走看看