C# Socket通信常用方法

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

1、引入命名空间

using System.Net; using System.Net.Sockets;

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

/// <summary> /// 连接使用tcp协议的服务端 /// </summary> /// <param name="ip">服务端的ip</param> /// <param name="port">服务端的端口号</param> /// <returns></returns> public static Socket ConnectServer(string ip, int port) { Socket s = null; try { IPAddress ipAddress = IPAddress.Parse(ip); IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port); s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); s.Connect(ipEndPoint); if (s.Connected == false) s = null; } catch (Exception) { } return s; }

3、发送数据

/// <summary> /// 向远程主机发送数据 /// </summary> /// <param name="socket">连接到远程主机的socket</param> /// <param name="buffer">待发送数据</param> /// <param name="outTime">发送超时时长,单位是秒(为-1时,将一直等待直到有数据需要发送)</param> /// <returns>0:发送成功;-1:超时;-2:出现错误;-3:出现异常</returns> public static int SendData(Socket socket, byte[] buffer, int outTime) { if (socket == null || socket.Connected == false) { throw new ArgumentException("参数socket为null,或者未连接到远程计算机"); } if (buffer == null || buffer.Length == 0) { throw new ArgumentException("参数buffer为null ,或者长度为 0"); } int flag = 0; try { int left = buffer.Length; int sndLen = 0; int hasSend = 0; while (true) { if ((socket.Poll(outTime * 1000, SelectMode.SelectWrite) == true)) { // 收集了足够多的传出数据后开始发送 sndLen = socket.Send(buffer, hasSend, left, SocketFlags.None); left -= sndLen; hasSend += sndLen; // 数据已经全部发送 if (left == 0) { flag = 0; break; } else { // 数据部分已经被发送 if (sndLen > 0) { continue; } else // 发送数据发生错误 { flag = -2; break; } } } else // 超时退出 { flag = -1; break; } } } catch (SocketException) { //Log flag = -3; } return flag; }

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


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


5、接受数据

/// <summary> /// 接收远程主机发送的数据 /// </summary> /// <param name="socket">要接收数据且已经连接到远程主机的</param> /// <param name="buffer">接收数据的缓冲区(需要接收的数据的长度,由 buffer 的长度决定)</param> /// <param name="outTime">接收数据的超时时间,单位秒(指定为-1时,将一直等待直到有数据需要接收)</param> /// <returns></returns> public static int RecvData(Socket socket, byte[] buffer, int outTime) { if (socket == null || socket.Connected == false) { throw new ArgumentException("socket为null,或者未连接到远程计算机"); } if (buffer == null || buffer.Length == 0) { throw new ArgumentException("buffer为null ,或者长度为 0"); } buffer.Initialize(); int left = buffer.Length; int curRcv = 0; int hasRecv=0; int flag = 0; try { while (true) { if (socket.Poll(outTime * 1000, SelectMode.SelectRead) == true) { // 已经有数据等待接收 curRcv = socket.Receive(buffer, hasRecv, left, SocketFlags.None); left -= curRcv; hasRecv += curRcv; // 数据已经全部接收 if (left == 0) { flag = 0; break; } else { // 数据已经部分接收 if (curRcv > 0) { continue; } else // 出现错误 { flag = -2; break; } } } else // 超时退出 { flag = -1; break; } } } catch (SocketException) { //Log flag = -3; } return flag; }

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值