C#网络通信Socket操作帮助类
创建一个基于TCP协议的Socket对象
创建一个基于UDP协议的Socket对象
指定Socket对象执行监听
以同步方式发送接收消息
关闭基于Tcp协议的Socket对象
发送电子邮件
检查设置的端口号是否正确,返回正确的端口号
......
using System; using System.Text; using System.Net.Sockets; using System.Net.Mail; using System.Net; namespace yunjsonHelper { /// <summary> /// 网络操作相关的类 /// </summary> public class NetHelper { #region 检查设置的IP地址是否正确,返回正确的IP地址 /// <summary> /// 检查设置的IP地址是否正确,并返回正确的IP地址,无效IP地址返回"-1"。 /// </summary> /// <param name="ip">设置的IP地址</param> //public static string GetValidIP(string ip) //{ // if (PageValidate.IsIP(ip)) // { // return ip; // } // else // { // return "-1"; // } //} #endregion #region 检查设置的端口号是否正确,返回正确的端口号 /// <summary> /// 检查设置的端口号是否正确,并返回正确的端口号,无效端口号返回-1。 /// </summary> /// <param name="port">设置的端口号</param> public static int GetValidPort(string port) { //声明返回的正确端口号 int validPort = -1; //最小有效端口号 const int MINPORT = 0; //最大有效端口号 const int MAXPORT = 65535; //检测端口号 try { //传入的端口号为空则抛出异常 if (port == "") { throw new Exception("端口号不能为空!"); } //检测端口范围 if ((Convert.ToInt32(port) < MINPORT) || (Convert.ToInt32(port) > MAXPORT)) { throw new Exception("端口号范围无效!"); } //为端口号赋值 validPort = Convert.ToInt32(port); } catch (Exception ex) { string errMessage = ex.Message; } return validPort; } #endregion #region 将字符串形式的IP地址转换成IPAddress对象 /// <summary> /// 将字符串形式的IP地址转换成IPAddress对象 /// </summary> /// <param name="ip">字符串形式的IP地址</param> public static IPAddress StringToIPAddress(string ip) { return IPAddress.Parse(ip); } #endregion #region 获取本机的计算机名 /// <summary> /// 获取本机的计算机名 /// </summary> public static string LocalHostName { get { return Dns.GetHostName(); } } #endregion #region 获取本机的局域网IP /// <summary> /// 获取本机的局域网IP /// </summary> public static string LANIP { get { //获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IP IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList; //如果本机IP列表为空,则返回空字符串 if (addressList.Length < 1) { return ""; } //返回本机的局域网IP return addressList[0].ToString(); } } #endregion #region 获取本机在Internet网络的广域网IP /// <summary> /// 获取本机在Internet网络的广域网IP /// </summary> public static string WANIP { get { //获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IP IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList; //如果本机IP列表小于2,则返回空字符串 if (addressList.Length < 2) { return ""; } //返回本机的广域网IP return addressList[1].ToString(); } } #endregion #region 获取远程客户机的IP地址 /// <summary> /// 获取远程客户机的IP地址 /// </summary> /// <param name="clientSocket">客户端的socket对象</param> public static string GetClientIP(Socket clientSocket) { IPEndPoint client = (IPEndPoint)clientSocket.RemoteEndPoint; return client.Address.ToString(); } #endregion #region 创建一个IPEndPoint对象 /// <summary> /// 创建一个IPEndPoint对象 /// </summary> /// <param name="ip">IP地址</param> /// <param name="port">端口号</param> public static IPEndPoint CreateIPEndPoint(string ip, int port) { IPAddress ipAddress = StringToIPAddress(ip); return new IPEndPoint(ipAddress, port); } #endregion #region 创建一个TcpListener对象 /// <summary> /// 创建一个自动分配IP和端口的TcpListener对象 /// </summary> public static TcpListener CreateTcpListener() { //创建一个自动分配的网络节点 IPAddress ipAddress = IPAddress.Any; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0); return new TcpListener(localEndPoint); } /// <summary> /// 创建一个TcpListener对象 /// </summary> /// <param name="ip">IP地址</param> /// <param name="port">端口</param> public static TcpListener CreateTcpListener(string ip, int port) { //创建一个网络节点 IPAddress ipAddress = StringToIPAddress(ip); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); return new TcpListener(localEndPoint); } #endregion #region 创建一个基于TCP协议的Socket对象 /// <summary> /// 创建一个基于TCP协议的Socket对象 /// </summary> public static Socket CreateTcpSocket() { return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } #endregion #region 创建一个基于UDP协议的Socket对象 /// <summary> /// 创建一个基于UDP协议的Socket对象 /// </summary> public static Socket CreateUdpSocket() { return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); } #endregion #region 获取本地终结点 #region 获取TcpListener对象的本地终结点 /// <summary> /// 获取TcpListener对象的本地终结点 /// </summary> /// <param name="tcpListener">TcpListener对象</param> public static IPEndPoint GetLocalPoint(TcpListener tcpListener) { return (IPEndPoint)tcpListener.LocalEndpoint; } /// <summary> /// 获取TcpListener对象的本地终结点的IP地址 /// </summary> /// <param name="tcpListener">TcpListener对象</param> public static string GetLocalPoint_IP(TcpListener tcpListener) { IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint; return localEndPoint.Address.ToString(); } /// <summary> /// 获取TcpListener对象的本地终结点的端口号 /// </summary> /// <param name="tcpListener">TcpListener对象</param> public static int GetLocalPoint_Port(TcpListener tcpListener) { IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint; return localEndPoint.Port; } #endregion #region 获取Socket对象的本地终结点 /// <summary> /// 获取Socket对象的本地终结点 /// </summary> /// <param name="socket">Socket对象</param> public static IPEndPoint GetLocalPoint(Socket socket) { return (IPEndPoint)socket.LocalEndPoint; } /// <summary> /// 获取Socket对象的本地终结点的IP地址 /// </summary> /// <param name="socket">Socket对象</param> public static string GetLocalPoint_IP(Socket socket) { IPEndPoint localEndPoint = (IPEndPoint)socket.LocalEndPoint; return localEndPoint.Address.ToString(); } /// <summary> /// 获取Socket对象的本地终结点的端口号 /// </summary> /// <param name="socket">Socket对象</param> public static int GetLocalPoint_Port(Socket socket) { IPEndPoint localEndPoint = (IPEndPoint)socket.LocalEndPoint; return localEndPoint.Port; } #endregion #endregion #region 绑定终结点 /// <summary> /// 绑定终结点 /// </summary> /// <param name="socket">Socket对象</param> /// <param name="endPoint">要绑定的终结点</param> public static void BindEndPoint(Socket socket, IPEndPoint endPoint) { if (!socket.IsBound) { socket.Bind(endPoint); } } /// <summary> /// 绑定终结点 /// </summary> /// <param name="socket">Socket对象</param> /// <param name="ip">服务器IP地址</param> /// <param name="port">服务器端口</param> public static void BindEndPoint(Socket socket, string ip, int port) { //创建终结点 IPEndPoint endPoint = CreateIPEndPoint(ip, port); //绑定终结点 if (!socket.IsBound) { socket.Bind(endPoint); } } #endregion #region 指定Socket对象执行监听 /// <summary> /// 指定Socket对象执行监听,默认允许的最大挂起连接数为100 /// </summary> /// <param name="socket">执行监听的Socket对象</param> /// <param name="port">监听的端口号</param> public static void StartListen(Socket socket, int port) { //创建本地终结点 IPEndPoint localPoint = CreateIPEndPoint(NetHelper.LocalHostName, port); //绑定到本地终结点 BindEndPoint(socket, localPoint); //开始监听 socket.Listen(100); } /// <summary> /// 指定Socket对象执行监听 /// </summary> /// <param name="socket">执行监听的Socket对象</param> /// <param name="port">监听的端口号</param> /// <param name="maxConnection">允许的最大挂起连接数</param> public static void StartListen(Socket socket, int port, int maxConnection) { //创建本地终结点 IPEndPoint localPoint = CreateIPEndPoint(NetHelper.LocalHostName, port); //绑定到本地终结点 BindEndPoint(socket, localPoint); //开始监听 socket.Listen(maxConnection); } /// <summary> /// 指定Socket对象执行监听 /// </summary> /// <param name="socket">执行监听的Socket对象</param> /// <param name="ip">监听的IP地址</param> /// <param name="port">监听的端口号</param> /// <param name="maxConnection">允许的最大挂起连接数</param> public static void StartListen(Socket socket, string ip, int port, int maxConnection) { //绑定到本地终结点 BindEndPoint(socket, ip, port); //开始监听 socket.Listen(maxConnection); } #endregion #region 连接到基于TCP协议的服务器 /// <summary> /// 连接到基于TCP协议的服务器,连接成功返回true,否则返回false /// </summary> /// <param name="socket">Socket对象</param> /// <param name="ip">服务器IP地址</param> /// <param name="port">服务器端口号</param> public static bool Connect(Socket socket, string ip, int port) { try { //连接服务器 socket.Connect(ip, port); //检测连接状态 return socket.Poll(-1, SelectMode.SelectWrite); } catch (SocketException ex) { throw new Exception(ex.Message); //LogHelper.WriteTraceLog(TraceLogLevel.Error, ex.Message); } } #endregion #region 以同步方式发送消息 /// <summary> /// 以同步方式向指定的Socket对象发送消息 /// </summary> /// <param name="socket">socket对象</param> /// <param name="msg">发送的消息</param> public static void SendMsg(Socket socket, byte[] msg) { //发送消息 socket.Send(msg, msg.Length, SocketFlags.None); } /// <summary> /// 使用UTF8编码格式以同步方式向指定的Socket对象发送消息 /// </summary> /// <param name="socket">socket对象</param> /// <param name="msg">发送的消息</param> public static void SendMsg(Socket socket, string msg) { //将字符串消息转换成字符数组 byte[] buffer = ConvertHelper.StringToBytes(msg, Encoding.Default); //发送消息 socket.Send(buffer, buffer.Length, SocketFlags.None); } #endregion #region 以同步方式接收消息 /// <summary> /// 以同步方式接收消息 /// </summary> /// <param name="socket">socket对象</param> /// <param name="buffer">接收消息的缓冲区</param> public static void ReceiveMsg(Socket socket, byte[] buffer) { socket.Receive(buffer); } /// <summary> /// 以同步方式接收消息,并转换为UTF8编码格式的字符串,使用5000字节的默认缓冲区接收。 /// </summary> /// <param name="socket">socket对象</param> public static string ReceiveMsg(Socket socket) { //定义接收缓冲区 byte[] buffer = new byte[5000]; //接收数据,获取接收到的字节数 int receiveCount = socket.Receive(buffer); //定义临时缓冲区 byte[] tempBuffer = new byte[receiveCount]; //将接收到的数据写入临时缓冲区 Buffer.BlockCopy(buffer, 0, tempBuffer, 0, receiveCount); //转换成字符串,并将其返回 return ConvertHelper.BytesToString(tempBuffer, Encoding.Default); } #endregion #region 关闭基于Tcp协议的Socket对象 /// <summary> /// 关闭基于Tcp协议的Socket对象 /// </summary> /// <param name="socket">要关闭的Socket对象</param> public static void Close(Socket socket) { try { //禁止Socket对象接收和发送数据 socket.Shutdown(SocketShutdown.Both); } catch (SocketException ex) { throw ex; } finally { //关闭Socket对象 socket.Close(); } } #endregion #region 发送电子邮件 /// <summary> /// 发送电子邮件,所有SMTP配置信息均在config配置文件中system.net节设置. /// </summary> /// <param name="receiveEmail">接收电子邮件的地址</param> /// <param name="msgSubject">电子邮件的标题</param> /// <param name="msgBody">电子邮件的正文</param> /// <param name="IsEnableSSL">是否开启SSL</param> public static bool SendEmail(string receiveEmail, string msgSubject, string msgBody, bool IsEnableSSL) { //创建电子邮件对象 MailMessage email = new MailMessage(); //设置接收人的电子邮件地址 email.To.Add(receiveEmail); //设置邮件的标题 email.Subject = msgSubject; //设置邮件的正文 email.Body = msgBody; //设置邮件为HTML格式 email.IsBodyHtml = true; //创建SMTP客户端,将自动从配置文件中获取SMTP服务器信息 SmtpClient smtp = new SmtpClient(); //开启SSL smtp.EnableSsl = IsEnableSSL; try { //发送电子邮件 smtp.Send(email); return true; } catch (Exception ex) { throw ex; } } #endregion } }