在服务器间通信,我们常常会用到socket进行通信,在C#中怎么使用socket进行通信呢?
1、引入命名空间
Csharp代码
- using System.Net;
- using System.Net.Sockets;
2、使用tcp协议,链接服务器的方法
Csharp代码
- /// <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、发送数据
Csharp代码
- /// <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的方法进行封装
Csharp代码
- /// <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、接受数据
总结:主要用到的类:IPAddress,SocketCsharp代码
- /// <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;
- }
联系客服