千家信息网

C#中Socket网络通信类是什么

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍了C#中Socket网络通信类是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。摘要之所以要进行Socket套接字通
千家信息网最后更新 2025年01月18日C#中Socket网络通信类是什么

这篇文章主要介绍了C#中Socket网络通信类是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

摘要

之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,特别对于初学者而言。实际上微软从.net 2.0开始已经提供了TCP、UDP通信高级封装类如下:

TcpListenerTcpClientUdpClient

微软从.net 4.0开始提供基于Task任务的异步通信接口。而直接使用socket封装库,很多socket本身的细节没办法自行控制,本文目就是提供一种socket的封装供参考。文中展示部分封装了TCP通信库,UDP封装也可触类旁通:

CusTcpListenerCusTcpClient

代码

using System;using System.Text;using System.Net.Sockets;using System.Net; namespace NetDemo{    // 网络操作相关的类     public class InternetProHelper    {               // 检查设置的端口号是否正确,并返回正确的端口号,无效端口号返回-1             public static int GetNetPort(string NetPort)        {            //声明返回的正确端口号            int resPort = -1;             //检测端口号            try            {                //传入的端口号为空则抛出异常                if (NetPort == "")                {                    throw new Exception("端口号不能为空!");                }                 //检测端口范围                if ((Convert.ToInt32(NetPort) < ushort.MinValue) || (Convert.ToInt32(NetPort) > ushort.MaxValue))                {                    throw new Exception("端口号范围无效!");                }                 //为端口号赋值                resPort = Convert.ToInt32(NetPort);            }            catch (Exception ex)            {                string errMessage = ex.Message;            }            return resPort;        }         public static IPAddress StringToIPAddress(string NetIP)        {            // 将字符串形式的IP地址转换成IPAddress对象            return IPAddress.Parse(NetIP);        }         public static string LocalHostName        {            // 获取本机的计算机名            get            {                return Dns.GetHostName();            }        }         public static string LANIP        {            // 获取本机的局域网IP            get            {                //获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IP                IPAddress[] IPaddrList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;                 //如果本机IP列表为空,则返回空字符串                if (IPaddrList.Length < 1)                {                    return "";                }                 //返回本机的局域网IP                return IPaddrList[0].ToString();            }        }          public static string GetClientIP(Socket clientSocket)        {            // 获取远程客户机的IP地址            IPEndPoint client = (IPEndPoint)clientSocket.RemoteEndPoint;//客户端的NetSocket对象            return client.Address.ToString();        }         public static IPEndPoint CreateIPEndPoint(string NetIP, int NetPort)        {            // 创建一个IPEndPoint对象            IPAddress ipAddress = StringToIPAddress(NetIP);            return new IPEndPoint(ipAddress, NetPort);        }         public static TcpListener CreateTcpListener()        {            //创建一个自动分配的网络节点            IPAddress ipAddress = IPAddress.Any;            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0);             return new TcpListener(localEndPoint);        }        public static TcpListener CreateTcpListener(string NetIP, int NetPort)        {            //创建一个网络节点            IPAddress ipAddress = StringToIPAddress(NetIP);            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, NetPort);             return new TcpListener(localEndPoint);        }         public static Socket CreateTcpSocket()        {            // 创建一个基于TCP协议的Socket对象            return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        }         public static Socket CreateUdpSocket()        {            // 创建一个基于UDP协议的Socket对象            return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);        }          public static IPEndPoint GetLocalPoint(TcpListener tcpListener)        {            // 获取TcpListener对象的本地终结点            return (IPEndPoint)tcpListener.LocalEndpoint;        }         public static string GetLocalPoint_IP(TcpListener tcpListener)        {            // 获取TcpListener对象的本地终结点的IP地址            IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint;            return localEndPoint.Address.ToString();        }         public static int GetLocalPoint_Port(TcpListener tcpListener)        {            // 获取TcpListener对象的本地终结点的端口号            IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint;            return localEndPoint.Port;        }         public static IPEndPoint GetLocalPoint(Socket NetSocket)        {            // 获取Socket对象的本地终结点            return (IPEndPoint)NetSocket.LocalEndPoint;        }         public static string GetLocalPoint_IP(Socket NetSocket)        {            // 获取Socket对象的本地终结点的IP地址            IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint;            return localEndPoint.Address.ToString();        }         public static int GetLocalPoint_Port(Socket NetSocket)        {            // 获取Socket对象的本地终结点的端口号            IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint;            return localEndPoint.Port;        }         public static void BindEndPoint(Socket NetSocket, IPEndPoint endPoint)        {            // 绑定终结点            if (!NetSocket.IsBound)            {                NetSocket.Bind(endPoint);            }        }         public static void BindEndPoint(Socket NetSocket, string NetIP, int NetPort)        {            //创建终结点            IPEndPoint endPoint = CreateIPEndPoint(NetIP, NetPort);             //绑定终结点            if (!NetSocket.IsBound)            {                NetSocket.Bind(endPoint);            }        }         public static void StartListen(Socket NetSocket, int NetPort)        {            //创建本地终结点            IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort);             //绑定到本地终结点            BindEndPoint(NetSocket, localPoint);             //开始监听            NetSocket.Listen(200);        }         public static void StartListen(Socket NetSocket, int NetPort, int maxConnection)        {            //创建本地终结点            IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort);             //绑定到本地终结点            BindEndPoint(NetSocket, localPoint);             //开始监听            NetSocket.Listen(maxConnection);        }         public static void StartListen(Socket NetSocket, string NetIP, int NetPort, int maxConnection)        {            //绑定到本地终结点            BindEndPoint(NetSocket, NetIP, NetPort);             //开始监听            NetSocket.Listen(maxConnection);        }         public static bool Connect(Socket NetSocket, string NetIP, int NetPort)        {            // 连接到基于TCP协议的服务器,连接成功返回true,否则返回false            try            {                //连接服务器                NetSocket.Connect(NetIP, NetPort);                 //检测连接状态                return NetSocket.Poll(-1, SelectMode.SelectWrite);            }            catch (SocketException ex)            {                throw new Exception(ex.Message);             }        }         // 以同步方式向指定的Socket对象发送消息        public static void SendMsg(Socket NetSocket, byte[] dataStr)        {            //发送消息            NetSocket.Send(dataStr, dataStr.Length, SocketFlags.None);        }         // 使用UTF8编码格式以同步方式向指定的Socket对象发送消息        public static void SendMsg(Socket NetSocket, string dataStr)        {            //将字符串消息转换成字符数组            byte[] NetBuf = System.Text.Encoding.UTF8.GetBytes(dataStr);             //发送消息            NetSocket.Send(NetBuf, NetBuf.Length, SocketFlags.None);        }         // 以同步方式接收消息        public static void ReceiveMsg(Socket NetSocket, byte[] NetBuf)        {            NetSocket.Receive(NetBuf);        }         // 以同步方式接收消息                public static string ReceiveMsg(Socket NetSocket)        {            //定义接收缓冲区            byte[] NetBuf = new byte[10000];            //接收数据,获取接收到的字节数            int RecvNum = NetSocket.Receive(NetBuf);             //定义临时缓冲区            byte[] DataBuf = new byte[RecvNum];            //将接收到的数据写入临时缓冲区            Buffer.BlockCopy(NetBuf, 0, DataBuf, 0, RecvNum);            //对DataBuf进行处理            return Convert.ToString(DataBuf);        }         // 关闭基于Tcp协议的Socket对象        public static void Close(Socket NetSocket)        {            try            {                //禁止Socket对象接收和发送数据                NetSocket.Shutdown(SocketShutdown.Both);            }            catch (SocketException ex)            {                throw ex;            }            finally            {                //关闭Socket对象                NetSocket.Close();            }        }     }}

感谢你能够认真阅读完这篇文章,希望小编分享的"C#中Socket网络通信类是什么"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0