C#網(wǎng)絡(luò)通信Socket操作幫助類

創(chuàng)建一個基于TCP協(xié)議的Socket對象

創(chuàng)建一個基于UDP協(xié)議的Socket對象

指定Socket對象執(zhí)行監(jiān)聽

以同步方式發(fā)送接收消息

關(guān)閉基于Tcp協(xié)議的Socket對象

發(fā)送電子郵件

檢查設(shè)置的端口號是否正確,返回正確的端口號

......



using System;
using System.Text;
using System.Net.Sockets;
using System.Net.Mail;
using System.Net;

namespace JsonsHelper
{
    /// <summary>
    /// 網(wǎng)絡(luò)操作相關(guān)的類
    /// </summary>    
    public class NetHelper
    {
        #region 檢查設(shè)置的IP地址是否正確,返回正確的IP地址
        /// <summary>
        /// 檢查設(shè)置的IP地址是否正確,并返回正確的IP地址,無效IP地址返回"-1"。
        /// </summary>
        /// <param name="ip">設(shè)置的IP地址</param>
        //public static string GetValidIP(string ip)
        //{
        //    if (PageValidate.IsIP(ip))
        //    {
        //        return ip;
        //    }
        //    else
        //    {
        //        return "-1";
        //    }
        //}
        #endregion

        #region 檢查設(shè)置的端口號是否正確,返回正確的端口號
        /// <summary>
        /// 檢查設(shè)置的端口號是否正確,并返回正確的端口號,無效端口號返回-1。
        /// </summary>
        /// <param name="port">設(shè)置的端口號</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地址轉(zhuǎn)換成IPAddress對象
        /// <summary>
        /// 將字符串形式的IP地址轉(zhuǎn)換成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 獲取本機的局域網(wǎng)IP
        /// <summary>
        /// 獲取本機的局域網(wǎng)IP
        /// </summary>        
        public static string LANIP
        {
            get
            {
                //獲取本機的IP列表,IP列表中的第一項是局域網(wǎng)IP,第二項是廣域網(wǎng)IP
                IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;

                //如果本機IP列表為空,則返回空字符串
                if (addressList.Length < 1)
                {
                    return "";
                }

                //返回本機的局域網(wǎng)IP
                return addressList[0].ToString();
            }
        }
        #endregion

        #region 獲取本機在Internet網(wǎng)絡(luò)的廣域網(wǎng)IP
        /// <summary>
        /// 獲取本機在Internet網(wǎng)絡(luò)的廣域網(wǎng)IP
        /// </summary>        
        public static string WANIP
        {
            get
            {
                //獲取本機的IP列表,IP列表中的第一項是局域網(wǎng)IP,第二項是廣域網(wǎng)IP
                IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;

                //如果本機IP列表小于2,則返回空字符串
                if (addressList.Length < 2)
                {
                    return "";
                }

                //返回本機的廣域網(wǎng)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 創(chuàng)建一個IPEndPoint對象
        /// <summary>
        /// 創(chuàng)建一個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 創(chuàng)建一個TcpListener對象
        /// <summary>
        /// 創(chuàng)建一個自動分配IP和端口的TcpListener對象
        /// </summary>        
        public static TcpListener CreateTcpListener()
        {
            //創(chuàng)建一個自動分配的網(wǎng)絡(luò)節(jié)點
            IPAddress ipAddress = IPAddress.Any;
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0);

            return new TcpListener(localEndPoint);
        }
        /// <summary>
        /// 創(chuàng)建一個TcpListener對象
        /// </summary>
        /// <param name="ip">IP地址</param>
        /// <param name="port">端口</param>        
        public static TcpListener CreateTcpListener(string ip, int port)
        {
            //創(chuàng)建一個網(wǎng)絡(luò)節(jié)點
            IPAddress ipAddress = StringToIPAddress(ip);
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);

            return new TcpListener(localEndPoint);
        }
        #endregion

        #region 創(chuàng)建一個基于TCP協(xié)議的Socket對象
        /// <summary>
        /// 創(chuàng)建一個基于TCP協(xié)議的Socket對象
        /// </summary>        
        public static Socket CreateTcpSocket()
        {
            return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        #endregion

        #region 創(chuàng)建一個基于UDP協(xié)議的Socket對象
        /// <summary>
        /// 創(chuàng)建一個基于UDP協(xié)議的Socket對象
        /// </summary>        
        public static Socket CreateUdpSocket()
        {
            return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        }
        #endregion

        #region 獲取本地終結(jié)點

        #region 獲取TcpListener對象的本地終結(jié)點
        /// <summary>
        /// 獲取TcpListener對象的本地終結(jié)點
        /// </summary>
        /// <param name="tcpListener">TcpListener對象</param>        
        public static IPEndPoint GetLocalPoint(TcpListener tcpListener)
        {
            return (IPEndPoint)tcpListener.LocalEndpoint;
        }

        /// <summary>
        /// 獲取TcpListener對象的本地終結(jié)點的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對象的本地終結(jié)點的端口號
        /// </summary>
        /// <param name="tcpListener">TcpListener對象</param>        
        public static int GetLocalPoint_Port(TcpListener tcpListener)
        {
            IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint;
            return localEndPoint.Port;
        }
        #endregion

        #region 獲取Socket對象的本地終結(jié)點
        /// <summary>
        /// 獲取Socket對象的本地終結(jié)點
        /// </summary>
        /// <param name="socket">Socket對象</param>        
        public static IPEndPoint GetLocalPoint(Socket socket)
        {
            return (IPEndPoint)socket.LocalEndPoint;
        }

        /// <summary>
        /// 獲取Socket對象的本地終結(jié)點的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對象的本地終結(jié)點的端口號
        /// </summary>
        /// <param name="socket">Socket對象</param>        
        public static int GetLocalPoint_Port(Socket socket)
        {
            IPEndPoint localEndPoint = (IPEndPoint)socket.LocalEndPoint;
            return localEndPoint.Port;
        }
        #endregion

        #endregion

        #region 綁定終結(jié)點
        /// <summary>
        /// 綁定終結(jié)點
        /// </summary>
        /// <param name="socket">Socket對象</param>
        /// <param name="endPoint">要綁定的終結(jié)點</param>
        public static void BindEndPoint(Socket socket, IPEndPoint endPoint)
        {
            if (!socket.IsBound)
            {
                socket.Bind(endPoint);
            }
        }

        /// <summary>
        /// 綁定終結(jié)點
        /// </summary>
        /// <param name="socket">Socket對象</param>        
        /// <param name="ip">服務(wù)器IP地址</param>
        /// <param name="port">服務(wù)器端口</param>
        public static void BindEndPoint(Socket socket, string ip, int port)
        {
            //創(chuàng)建終結(jié)點
            IPEndPoint endPoint = CreateIPEndPoint(ip, port);

            //綁定終結(jié)點
            if (!socket.IsBound)
            {
                socket.Bind(endPoint);
            }
        }
        #endregion

        #region 指定Socket對象執(zhí)行監(jiān)聽
        /// <summary>
        /// 指定Socket對象執(zhí)行監(jiān)聽,默認允許的最大掛起連接數(shù)為100
        /// </summary>
        /// <param name="socket">執(zhí)行監(jiān)聽的Socket對象</param>
        /// <param name="port">監(jiān)聽的端口號</param>
        public static void StartListen(Socket socket, int port)
        {
            //創(chuàng)建本地終結(jié)點
            IPEndPoint localPoint = CreateIPEndPoint(NetHelper.LocalHostName, port);

            //綁定到本地終結(jié)點
            BindEndPoint(socket, localPoint);

            //開始監(jiān)聽
            socket.Listen(100);
        }

        /// <summary>
        /// 指定Socket對象執(zhí)行監(jiān)聽
        /// </summary>
        /// <param name="socket">執(zhí)行監(jiān)聽的Socket對象</param>
        /// <param name="port">監(jiān)聽的端口號</param>
        /// <param name="maxConnection">允許的最大掛起連接數(shù)</param>
        public static void StartListen(Socket socket, int port, int maxConnection)
        {
            //創(chuàng)建本地終結(jié)點
            IPEndPoint localPoint = CreateIPEndPoint(NetHelper.LocalHostName, port);

            //綁定到本地終結(jié)點
            BindEndPoint(socket, localPoint);

            //開始監(jiān)聽
            socket.Listen(maxConnection);
        }

        /// <summary>
        /// 指定Socket對象執(zhí)行監(jiān)聽
        /// </summary>
        /// <param name="socket">執(zhí)行監(jiān)聽的Socket對象</param>
        /// <param name="ip">監(jiān)聽的IP地址</param>
        /// <param name="port">監(jiān)聽的端口號</param>
        /// <param name="maxConnection">允許的最大掛起連接數(shù)</param>
        public static void StartListen(Socket socket, string ip, int port, int maxConnection)
        {
            //綁定到本地終結(jié)點
            BindEndPoint(socket, ip, port);

            //開始監(jiān)聽
            socket.Listen(maxConnection);
        }
        #endregion

        #region 連接到基于TCP協(xié)議的服務(wù)器
        /// <summary>
        /// 連接到基于TCP協(xié)議的服務(wù)器,連接成功返回true,否則返回false
        /// </summary>
        /// <param name="socket">Socket對象</param>
        /// <param name="ip">服務(wù)器IP地址</param>
        /// <param name="port">服務(wù)器端口號</param>     
        public static bool Connect(Socket socket, string ip, int port)
        {
            try
            {
                //連接服務(wù)器
                socket.Connect(ip, port);

                //檢測連接狀態(tài)
                return socket.Poll(-1, SelectMode.SelectWrite);
            }
            catch (SocketException ex)
            {
                throw new Exception(ex.Message);
                //LogHelper.WriteTraceLog(TraceLogLevel.Error, ex.Message);
            }
        }
        #endregion

        #region 以同步方式發(fā)送消息
        /// <summary>
        /// 以同步方式向指定的Socket對象發(fā)送消息
        /// </summary>
        /// <param name="socket">socket對象</param>
        /// <param name="msg">發(fā)送的消息</param>
        public static void SendMsg(Socket socket, byte[] msg)
        {
            //發(fā)送消息
            socket.Send(msg, msg.Length, SocketFlags.None);
        }

        /// <summary>
        /// 使用UTF8編碼格式以同步方式向指定的Socket對象發(fā)送消息
        /// </summary>
        /// <param name="socket">socket對象</param>
        /// <param name="msg">發(fā)送的消息</param>
        public static void SendMsg(Socket socket, string msg)
        {
            //將字符串消息轉(zhuǎn)換成字符數(shù)組
            byte[] buffer = ConvertHelper.StringToBytes(msg, Encoding.Default);

            //發(fā)送消息
            socket.Send(buffer, buffer.Length, SocketFlags.None);
        }
        #endregion

        #region 以同步方式接收消息
        /// <summary>
        /// 以同步方式接收消息
        /// </summary>
        /// <param name="socket">socket對象</param>
        /// <param name="buffer">接收消息的緩沖區(qū)</param>
        public static void ReceiveMsg(Socket socket, byte[] buffer)
        {
            socket.Receive(buffer);
        }

        /// <summary>
        /// 以同步方式接收消息,并轉(zhuǎn)換為UTF8編碼格式的字符串,使用5000字節(jié)的默認緩沖區(qū)接收。
        /// </summary>
        /// <param name="socket">socket對象</param>        
        public static string ReceiveMsg(Socket socket)
        {
            //定義接收緩沖區(qū)
            byte[] buffer = new byte[5000];
            //接收數(shù)據(jù),獲取接收到的字節(jié)數(shù)
            int receiveCount = socket.Receive(buffer);

            //定義臨時緩沖區(qū)
            byte[] tempBuffer = new byte[receiveCount];
            //將接收到的數(shù)據(jù)寫入臨時緩沖區(qū)
            Buffer.BlockCopy(buffer, 0, tempBuffer, 0, receiveCount);
            //轉(zhuǎn)換成字符串,并將其返回
            return ConvertHelper.BytesToString(tempBuffer, Encoding.Default);
        }
        #endregion

        #region 關(guān)閉基于Tcp協(xié)議的Socket對象
        /// <summary>
        /// 關(guān)閉基于Tcp協(xié)議的Socket對象
        /// </summary>
        /// <param name="socket">要關(guān)閉的Socket對象</param>
        public static void Close(Socket socket)
        {
            try
            {
                //禁止Socket對象接收和發(fā)送數(shù)據(jù)
                socket.Shutdown(SocketShutdown.Both);
            }
            catch (SocketException ex)
            {
                throw ex;
            }
            finally
            {
                //關(guān)閉Socket對象
                socket.Close();
            }
        }
        #endregion

        #region 發(fā)送電子郵件
        /// <summary>
        /// 發(fā)送電子郵件,所有SMTP配置信息均在config配置文件中system.net節(jié)設(shè)置.
        /// </summary>
        /// <param name="receiveEmail">接收電子郵件的地址</param>
        /// <param name="msgSubject">電子郵件的標(biāo)題</param>
        /// <param name="msgBody">電子郵件的正文</param>
        /// <param name="IsEnableSSL">是否開啟SSL</param>
        public static bool SendEmail(string receiveEmail, string msgSubject, string msgBody, bool IsEnableSSL)
        {
            //創(chuàng)建電子郵件對象
            MailMessage email = new MailMessage();
            //設(shè)置接收人的電子郵件地址
            email.To.Add(receiveEmail);
            //設(shè)置郵件的標(biāo)題
            email.Subject = msgSubject;
            //設(shè)置郵件的正文
            email.Body = msgBody;
            //設(shè)置郵件為HTML格式
            email.IsBodyHtml = true;

            //創(chuàng)建SMTP客戶端,將自動從配置文件中獲取SMTP服務(wù)器信息
            SmtpClient smtp = new SmtpClient();
            //開啟SSL
            smtp.EnableSsl = IsEnableSSL;

            try
            {
                //發(fā)送電子郵件
                smtp.Send(email);

                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }
}


原文鏈接:C#網(wǎng)絡(luò)通信協(xié)議Socket操作幫助類