C#基于Socket的网络通信类你了解吗

 更新时间:2022年03月29日 11:37:25   作者:IT技术猿猴  
这篇文章主要为大家详细介绍了C#基于Socket的网络通信类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

摘要

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

TcpListener
TcpClient
UdpClient

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

CusTcpListener
CusTcpClient

代码

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#操作txt文件,进行清空添加操作的小例子

    C#操作txt文件,进行清空添加操作的小例子

    这篇文章介绍了C#操作txt文件,进行清空添加操作的小例子,有需要的朋友可以参考一下
    2013-09-09
  • c# 编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    c# 编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    这篇文章主要介绍了c# 如何编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#开发之int与string转化操作

    C#开发之int与string转化操作

    这篇文章主要介绍了C#开发之int与string转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C# 中DateTime 的使用技巧汇总

    C# 中DateTime 的使用技巧汇总

    本文主要介绍了DateTime的使用技巧,包括获取本周、上周、下周、本月、上个月、下个月、本季度、上季度、下季度、本年度、上年度、下年度等多个方法,分享给大家,希望对大家有所帮助。
    2016-04-04
  • 解析C#彩色图像灰度化算法的实现代码详解

    解析C#彩色图像灰度化算法的实现代码详解

    本篇文章是对C#中彩色图像灰度化算法的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#中动态数组用法实例

    C#中动态数组用法实例

    这篇文章主要介绍了C#中动态数组用法,实例分析了C#中ArrayList实现动态数组的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#通过抽象工厂模式造车

    C#通过抽象工厂模式造车

    这篇文章介绍了C#通过抽象工厂模式造车的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • C#数据类型实现背包、队列和栈

    C#数据类型实现背包、队列和栈

    本文详细讲解了C#数据结构类型,并实现背包、队列和栈的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# 泛型List排序的实现

    C# 泛型List排序的实现

    本文主要介绍了C# 泛型List排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 如何使用C# 捕获进程输出

    如何使用C# 捕获进程输出

    这篇文章主要介绍了如何使用C# 捕获进程输出,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-08-08

最新评论