打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# Socket通信常用方法

在服务器间通信,我们常常会用到socket进行通信,在C#中怎么使用socket进行通信呢?

1、引入命名空间

Csharp代码
  1. using System.Net;  
  2. using System.Net.Sockets;  

2、使用tcp协议,链接服务器的方法

Csharp代码
  1. /// <summary>  
  2. /// 连接使用tcp协议的服务端  
  3. /// </summary>  
  4. /// <param name="ip">服务端的ip</param>  
  5. /// <param name="port">服务端的端口号</param>  
  6. /// <returns></returns>  
  7. public static Socket ConnectServer(string ip, int port)  
  8. {  
  9.     Socket s = null;  
  10.     try  
  11.     {  
  12.         IPAddress ipAddress = IPAddress.Parse(ip);  
  13.         IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);  
  14.         s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);  
  15.         s.Connect(ipEndPoint);  
  16.         if (s.Connected == false) s = null;  
  17.     }  
  18.     catch (Exception)  
  19.     {      
  20.     }  
  21.     return s;  
  22. }  

3、发送数据

Csharp代码
  1. /// <summary>  
  2. /// 向远程主机发送数据  
  3. /// </summary>  
  4. /// <param name="socket">连接到远程主机的socket</param>  
  5. /// <param name="buffer">待发送数据</param>  
  6. /// <param name="outTime">发送超时时长,单位是秒(为-1时,将一直等待直到有数据需要发送)</param>  
  7. /// <returns>0:发送成功;-1:超时;-2:出现错误;-3:出现异常</returns>  
  8. public static int SendData(Socket socket, byte[] buffer, int outTime)  
  9. {  
  10.     if (socket == null || socket.Connected == false)  
  11.     {  
  12.         throw new ArgumentException("参数socket为null,或者未连接到远程计算机");  
  13.     }  
  14.     if (buffer == null || buffer.Length == 0)  
  15.     {  
  16.         throw new ArgumentException("参数buffer为null ,或者长度为 0");  
  17.     }  
  18.   
  19.     int flag = 0;  
  20.     try  
  21.     {  
  22.         int left = buffer.Length;  
  23.         int sndLen = 0;  
  24.         int hasSend = 0;  
  25.   
  26.         while (true)  
  27.         {  
  28.             if ((socket.Poll(outTime * 1000, SelectMode.SelectWrite) == true))  
  29.             {     
  30.                 // 收集了足够多的传出数据后开始发送  
  31.                 sndLen = socket.Send(buffer, hasSend, left, SocketFlags.None);  
  32.                 left -= sndLen;  
  33.                 hasSend += sndLen;  
  34.   
  35.                 // 数据已经全部发送  
  36.                 if (left == 0)  
  37.                 {                                          
  38.                     flag = 0;  
  39.                     break;  
  40.                 }  
  41.                 else  
  42.                 {  
  43.                     // 数据部分已经被发送  
  44.                     if (sndLen > 0)  
  45.                     {                                      
  46.                         continue;  
  47.                     }  
  48.                     else // 发送数据发生错误  
  49.                     {                                                  
  50.                         flag = -2;  
  51.                         break;  
  52.                     }  
  53.                 }  
  54.             }  
  55.             else // 超时退出  
  56.             {                                                          
  57.                 flag = -1;  
  58.                 break;  
  59.             }  
  60.         }  
  61.     }  
  62.     catch (SocketException)  
  63.     {  
  64.         //Log  
  65.         flag = -3;  
  66.     }  
  67.     return flag;  
  68. }  

4、发送string数据,用到方法System.Text.Encoding.Default.GetBytes对上面3的方法进行封装


Csharp代码
  1. /// <summary>  
  2.    /// 向远程主机发送数据  
  3.    /// </summary>  
  4.    /// <param name="socket">连接到远程主机的socket</param>  
  5.    /// <param name="buffer">待发送的字符串</param>  
  6.    /// <param name="outTime">发送数据的超时时间,单位是秒(为-1时,将一直等待直到有数据需要发送)</param>  
  7.    /// <returns>0:发送数据成功;-1:超时;-2:错误;-3:异常</returns>  
  8.    public static int SendData(Socket socket, string buffer, int outTime)  
  9.    {  
  10.        if (buffer == null || buffer.Length == 0)  
  11.        {  
  12.            throw new ArgumentException("buffer为null或则长度为0.");  
  13.        }  
  14.        return SendData(socket, System.Text.Encoding.Default.GetBytes(buffer), outTime);  
  15.    }  


5、接受数据

Csharp代码
  1. /// <summary>  
  2. /// 接收远程主机发送的数据  
  3. /// </summary>  
  4. /// <param name="socket">要接收数据且已经连接到远程主机的</param>  
  5. /// <param name="buffer">接收数据的缓冲区(需要接收的数据的长度,由 buffer 的长度决定)</param>  
  6. /// <param name="outTime">接收数据的超时时间,单位秒(指定为-1时,将一直等待直到有数据需要接收)</param>  
  7. /// <returns></returns>  
  8. public static int RecvData(Socket socket, byte[] buffer, int outTime)  
  9. {  
  10.     if (socket == null || socket.Connected == false)  
  11.     {  
  12.         throw new ArgumentException("socket为null,或者未连接到远程计算机");  
  13.     }  
  14.     if (buffer == null || buffer.Length == 0)  
  15.     {  
  16.         throw new ArgumentException("buffer为null ,或者长度为 0");  
  17.     }  
  18.   
  19.     buffer.Initialize();  
  20.     int left = buffer.Length;  
  21.     int curRcv = 0;  
  22.     int hasRecv=0;  
  23.     int flag = 0;  
  24.   
  25.     try  
  26.     {  
  27.         while (true)  
  28.         {  
  29.             if (socket.Poll(outTime * 1000, SelectMode.SelectRead) == true)  
  30.             {     
  31.                 // 已经有数据等待接收  
  32.                 curRcv = socket.Receive(buffer, hasRecv, left, SocketFlags.None);  
  33.                 left -= curRcv;  
  34.                 hasRecv += curRcv;  
  35.   
  36.                 // 数据已经全部接收   
  37.                 if (left == 0)  
  38.                 {                                      
  39.                     flag = 0;  
  40.                     break;  
  41.                 }  
  42.                 else  
  43.                 {  
  44.                     // 数据已经部分接收  
  45.                     if (curRcv > 0)  
  46.                     {                                  
  47.                         continue;  
  48.                     }  
  49.                     else  // 出现错误  
  50.                     {                                             
  51.                         flag = -2;  
  52.                         break;  
  53.                     }  
  54.                 }  
  55.             }  
  56.             else // 超时退出  
  57.             {                                                      
  58.                 flag = -1;  
  59.                 break;  
  60.             }  
  61.         }  
  62.     }  
  63.     catch (SocketException)  
  64.     {  
  65.         //Log  
  66.         flag = -3;  
  67.     }  
  68.     return flag;  
  69. }  


总结:主要用到的类:IPAddress,Socket



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C# TCP 客户端代码
LR socket脚本参数化
C#使用SocketAsyncEventArgs操作套接字的简单异步通讯
Socket连接池
linux多线程编程,你还在用sleep么?用pthread
C# Socket的TCP通讯
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服