千家信息网

C#如何实现基于Socket套接字的网络通信封装

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下C#如何实现基于Socket套接字的网络通信封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!摘要之所以
千家信息网最后更新 2026年11月01日C#如何实现基于Socket套接字的网络通信封装

小编给大家分享一下C#如何实现基于Socket套接字的网络通信封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

摘要

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

TcpListener
TcpClient
UdpClient

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

CusTcpListener
CusTcpClient

TCP服务端

TCP服务端封装了服务端本地绑定、监听、接受客户端连接,并提供了网络数据流的接口。完整代码:

public class CusTcpListener    {        private IPEndPoint mServerSocketEndPoint;        private Socket mServerSocket;        private bool isActive;         public Socket Server        {            get { return this.mServerSocket; }        }        protected bool Active        {            get { return this.isActive; }        }        public EndPoint LocalEndpoint        {            get            {                if (!this.isActive)                {                    return this.mServerSocketEndPoint;                }                return this.mServerSocket.LocalEndPoint;            }        }        public NetworkStream DataStream        {            get            {                NetworkStream networkStream = null;                if (this.Server.Connected)                {                    networkStream = new NetworkStream(this.Server, true);                }                return networkStream;            }        }         public CusTcpListener(IPEndPoint localEP)        {            this.mServerSocketEndPoint = localEP;            this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);        }         public CusTcpListener(string localaddr, int port)        {            if (localaddr == null)            {                throw new ArgumentNullException("localaddr");            }            this.mServerSocketEndPoint = new IPEndPoint(IPAddress.Parse(localaddr), port);            this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);        }         public CusTcpListener(int port)        {            this.mServerSocketEndPoint = new IPEndPoint(IPAddress.Any, port);            this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);        }         public void Start()        {            this.Start(int.MaxValue);        }        ///         /// 开始服务器监听        ///         /// 同时等待连接的最大个数(半连接队列个数限制)        public void Start(int backlog)        {            if (backlog > int.MaxValue || backlog < 0)            {                throw new ArgumentOutOfRangeException("backlog");            }            if (this.mServerSocket == null)            {                throw new NullReferenceException("套接字为空");            }            this.mServerSocket.Bind(this.mServerSocketEndPoint);            this.mServerSocket.Listen(backlog);            this.isActive = true;        }        public void Stop()        {            if (this.mServerSocket != null)            {                this.mServerSocket.Close();                this.mServerSocket = null;            }            this.isActive = false;            this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);        }         public Socket AcceptSocket()        {            Socket socket = this.mServerSocket.Accept();            return socket;        }         public CusTcpClient AcceptTcpClient()        {            CusTcpClient tcpClient = new CusTcpClient(this.mServerSocket.Accept());            return tcpClient;        }    }

TCP客户端

TCP客户端封装了客户端本地绑定、连接服务器,并提供了网络数据流的接口。完整代码:

public class CusTcpClient : IDisposable    {        public Socket Client { get; set; }        protected bool Active { get; set; }        public IPEndPoint ClientSocketEndPoint { get; set; }        public bool IsConnected { get { return this.Client.Connected; } }        public NetworkStream DataStream        {            get            {                NetworkStream networkStream = null;                if (this.Client.Connected)                {                    networkStream = new NetworkStream(this.Client, true);                }                return networkStream;            }        }         public CusTcpClient(IPEndPoint localEP)        {            if (localEP == null)            {                throw new ArgumentNullException("localEP");            }            this.Client = new Socket(localEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);            this.Active = false;            this.Client.Bind(localEP);            this.ClientSocketEndPoint = localEP;        }         public CusTcpClient(string localaddr, int port)        {            if (localaddr == null)            {                throw new ArgumentNullException("localaddr");            }            IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(localaddr), port);            this.Client = new Socket(localEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);            this.Active = false;            this.Client.Bind(localEP);            this.ClientSocketEndPoint = localEP;        }        internal CusTcpClient(Socket acceptedSocket)        {            this.Client = acceptedSocket;            this.Active = true;            this.ClientSocketEndPoint = (IPEndPoint)this.Client.LocalEndPoint;        }         public void Connect(string address, int port)        {            if (address == null)            {                throw new ArgumentNullException("address");            }            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(address), port);            this.Connect(remoteEP);        }         public void Connect(IPEndPoint remoteEP)        {            if (remoteEP == null)            {                throw new ArgumentNullException("remoteEP");            }            this.Client.Connect(remoteEP);            this.Active = true;        }         public void Close()        {            this.Dispose(true);        }        protected virtual void Dispose(bool disposing)        {            if (disposing)            {                IDisposable dataStream = this.DataStream;                if (dataStream != null)                {                    dataStream.Dispose();                }                else                {                    Socket client = this.Client;                    if (client != null)                    {                        client.Close();                        this.Client = null;                    }                }                GC.SuppressFinalize(this);            }        }         public void Dispose()        {            this.Dispose(true);        }    }

通信实验

控制台程序试验,服务端程序:

class Program    {        static void Main(string[] args)        {            Thread listenerThread = new Thread(ListenerClientConnection);            listenerThread.IsBackground = true;            listenerThread.Start();             Console.ReadKey();        }         private static void ListenerClientConnection()        {            CusTcpListener tcpListener = new CusTcpListener("127.0.0.1", 5100);            tcpListener.Start();            Console.WriteLine("等待客户端连接……");            while (true)            {                CusTcpClient tcpClient = tcpListener.AcceptTcpClient();                 Console.WriteLine("客户端接入,ip={0} port={1}",                    tcpClient.ClientSocketEndPoint.Address, tcpClient.ClientSocketEndPoint.Port);                Thread thread = new Thread(DataHandleProcess);                thread.IsBackground = true;                thread.Start(tcpClient);            }        }         private static void DataHandleProcess(object obj)        {            CusTcpClient tcpClient = (CusTcpClient)obj;            StreamReader streamReader = new StreamReader(tcpClient.DataStream, Encoding.Default);            Console.WriteLine("等待客户端输入:");            while (true)            {                try                {                    string receStr = streamReader.ReadLine();                    Console.WriteLine(receStr);                }                catch (Exception)                {                    Console.WriteLine("断开连接");                    break;                }                Thread.Sleep(5);            }        }    }

客户端程序:

class Program    {        static void Main(string[] args)        {            Thread listenerThread = new Thread(UserProcess);            listenerThread.IsBackground = true;            listenerThread.Start();             Console.ReadKey();        }         private static void UserProcess()        {            Console.WriteLine("连接服务器");            CusTcpClient tcpClient = new CusTcpClient("127.0.0.1", 5080);            tcpClient.Connect("127.0.0.1", 5100);             Console.WriteLine("开始和服务器通信");            StreamWriter sw = new StreamWriter(tcpClient.DataStream, Encoding.Default);            sw.AutoFlush = true;            while (true)            {                for (int i = 0; i < 10; i++)                {                    string str = string.Format("第{0}次,内容:{1}", i, "测试通信");                    Console.WriteLine("发送数据:{0}", str);                    sw.WriteLine(str);                }                break;            }        }    }

通信成功:

通过本次封装演示可实现基于Socket的通信库封装,目的就是使用Socket通信库让应用开发人员在进行网络通讯编程时无需关心底层通讯机制,而只关心应用层的开发,让开发变得更简洁。当然UDP封装类似,可自行设计。当然本文只是一种示例,实际使用可使用.net自带封装库或自定义封装。

以上是"C#如何实现基于Socket套接字的网络通信封装"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

封装 通信 客户 客户端 服务 网络 套接字 服务器 网络通信 内容 接口 数据 程序 篇文章 开发 C# 个数 代码 实际 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东特亿宝互联网科技有限公司 互联网科技活动banner 互联网科技英文 世界互联网领先科技成果 安徽鑫晟辉互联网科技 鑫亿盛互联网科技 互联网科技公司做什么 华脉科技工业互联网产品 剑昆互联网络科技有限公司临桂 常德市电业局互联网科技部 阿里互联网科技公司 互联网时代科技改变生活 江阴互联网智能科技产品进口 链环科技传统企业怎么转型互联网 世界互联网领先科技成果获奖 互联网科技如何创业 中和天地互联网科技有限公司 互联网科技圈年度人物 东风日产互联网科技公司叫什么 科技互联网企业在行动 新华互联网科技 广州百单互联网科技有限公司 麻工互联网科技 与互联网科技公司 科技与互联网发展 奇酷互联网科技 智腾互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 互联网科技品牌 互联网科技创业有什么好项目
0