C#使用Socket进行简单的通讯的示例代码
作者:rjcql
Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务,提供了一系列的接口来支持应用层的调用,下面我们就来学习一下如何使用Socket进行简单的通讯,需要的可以参考下
写在前面
在.Net的 System.Net.Sockets 命名空间中包含托管的跨平台套接字网络实现。 System.Net 命名空间中的所有其他网络访问类均建立在套接字的此实现之上。
其中的Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务,提供了一系列的接口来支持应用层的调用。
本文只是提供一个可运行的基本示例,如果想深入了解关于TCP/IP协议的部分,可自行做更深入的知识拓展。
示例的代码实现的服务端和客户端的流程如下,展现了使用Socket进行一个完整的构建和通讯流程
服务器端:
第一步:建立一个用于通信的Socket对象
第二步:使用bind绑定IP地址和端口号
第三步:使用listen监听客户端
第四步:使用accept中断程序直到连接上客户端
第五步:接收来自客户端的请求
第六步:返回客户端需要的数据
第七步:如果接收到客户端已关闭连接信息就关闭服务器端
客户端:
第一步:建立一个用于通信的Socket对象
第二步:根据指定的IP和端口connet服务器
第三步:连接成功后向服务器端发送数据请求
第四步:接收服务器返回的请求数据
第五步:如果还需要请求数据继续发送请求
第六步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信
代码实现
服务端部分
using System; using System.Net; using System.Net.Sockets; using System.Text; class Program { static void Main(string[] args) { Console.WriteLine("Socket Server"); // 创建服务端Socket对象 var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090)); serverSocket.ReceiveTimeout = 1000; serverSocket.SendTimeout = 1000; serverSocket.Listen(1000); Console.WriteLine("服务端启动监听"); var clientSocket = serverSocket.Accept(); Console.WriteLine("有客户端连上了"); var task = Task.Run(() => { while (true) { var receivedMsg = string.Empty; var receivedBytes = new byte[1024]; var bytes = clientSocket.Receive(receivedBytes, receivedBytes.Length, 0); if (bytes > 0) { receivedMsg += Encoding.UTF8.GetString(receivedBytes, 0, bytes); Console.WriteLine("收到消息:" + receivedMsg); } // 服务端心跳间隔 Thread.Sleep(1000); } }); Console.ReadLine(); } }
客户端部分
using System; using System.Net; using System.Net.Sockets; using System.Text; class Program { static void Main(string[] args) { Console.WriteLine("Socket Client"); // 创建客户端Socket对象 var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.ReceiveTimeout = 1000; clientSocket.SendTimeout = 1000; clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090)); Console.WriteLine("客户端开始连接"); var task = Task.Run(() => { var idx = 0; while (true) { var sendMsg = "来自客户端消息" + (++idx); clientSocket.Send(Encoding.UTF8.GetBytes(sendMsg)); Console.WriteLine("客户端发送的数据:" + sendMsg); // 客户端心跳间隔 Thread.Sleep(1000); } }); Console.ReadLine(); } }
运行示例
总结
之前的项目中一般是用现成的成熟框架来做通讯实现,本例纯粹是做个关于底层类库原理知识点的梳理,关于粘包分包和多线程多频道的处理,后续有时间再做深入的实践。
到此这篇关于C#使用Socket进行简单的通讯的示例代码的文章就介绍到这了,更多相关C# Socket通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!