C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)

avatar
作者
筋斗云
阅读量:0

目录

一、Socket类

1.Socket类的常用属性及说明

2.Socket类的常用方法及说明

二、TcpClient类

三、TcpListener类 

四、示例

1.源码

2.生成效果


        TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在C#中,TCP程序设计是指利用Socket类、TcpClient类和 TcpListener类编写的网络通信程序,这3个类都位于System.Net.Sockets命名空间中。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器端程序,另一个称为客户端程序。

一、Socket类

        Socket类为网络通信提供了一套丰富的方法和属性,主要用于管理连接,实现Berkeley套接字接口,同时它还定义了绑定、连接网络端点及传输数据所需的各种方法,提供处理端点连接传输等细节所需要的功能。TcpClient和UdpClinet等类在内部使用该类。

1.Socket类的常用属性及说明

属性

说明

AddressFamily

获取Socket的地址族

Availabe

获取已经从网络接收且可供读取的数据量

Connected

获取一个值,该值指示Socket是在上次Send还是Receive操作时连接到远程主机

Handle

获取Socket的操作系统句柄

LocalEndPoint

获取本地终结点

ProtocolType

获取Socket的协议类型

RemoteEndPoint

获取远程终结点

SendTimeout

获取或设置一个值,该值指定之后同步Send调用将超时的时间长度

2.Socket类的常用方法及说明

方法说明
Accept为新建连接创建新的Socket
BeginAccept开始一个异步操作来接受一个传入的连接尝试
BeginConnect开始一个对远程主机连接的异步请求
BeginDisconnect开始异步请求从远程终结点断开连接
BeginReceive开始从连接的Socket中异步接收数据
BeginSend将数据异步发送到连接的Socket
BeginSendFile将文件异步发送到连接的Socket
BeginSendTo向特定远程主机异步发送数据
Close关闭Socket连接并释放所有关联的资源
Connect建立与远程主机的连接
Disconnect关闭套接字连接并允许重用套接字
EndAccept异步接受传入的连接尝试
EndConnect结束挂起的异步连接请求
EndDisconnect结束挂起的异步断开连接请求
EndReceive结束挂起的异步读取
EndSend结束挂起的异步发送
EndSendFile结束文件的挂起异步发送
EndSendTo结束挂起的、向指定位置进行的异步发送
Listen将Socket置于侦听状态
Receive接收来自绑定的Socket的数据
Send将数据发送到连接的Socket
SendFile将文件和可选数据异步发送到连接的Socket
SendTo将数据发送到特定终结点
Shutdown禁用某Socket上的发送和接收

二、TcpClient类

        TcpClient类用于在同步阻止模式下通过网络来连接、发送和接收流数据。为了使TcpClient连接并交换数据,TcpListener实例或Socket实例必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接该侦听器。

  • 创建一个TcpClient,并调用Connect方法连接。
  • 使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接。
  • TcpListener类用于在阻止同步模式下侦听和接受传入的连接请求。可使用TcpClient类或Socket类来连接TcpListener,并且可以使用IPEndPoint、本地IP地址及端口号或者仅使用端口号来创建TcpListener实例对象。

        TcpClient类的常用属性、方法及说明如表:

属性及方法

说明

Available属性

获取已经从网络接收且可供读取的数据量

Client属性

获取或设置基础Socket

Connected属性

获取一个值,该值指示TepClient的基础Socket是否已连接到远程主机

RecieveBufferSize属性

获取或设置接收缓冲区的大小

RecieveTimeout属性

获取或设置在初始化一个读取操作后TcpClient等待接收数据的时间量

SendBufferSize属性

获取或设置发送缓冲区的大小

SendTimeout属性

获取或设置TcpClient等待发送操作成功完成的时间量

BeginConnect方法

开始一个对远程主机连接的异步请求

Close方法

释放此TcpClient实例,而不关闭基础连接

Connec方法

使用指定的主机名和端口号将客户端连接到TCP主机

EndConnect方法

异步接受传入的连接尝试

GetStream方法

返回用于发送和接收数据的NetworkStream

三、TcpListener类 

        TcpListener类的常用属性、方法及说明如表: 

属性及方法说明
LocalEndpoint属性获取当前TcpListener的基础EndPoint
Server属性获取基础网络Socket
AcceptSocket/AcceptTcpClient方法接受挂起的连接请求
BeginAcceptSocket/BeginAcceptTcpClient方法开始一个异步操作来接受一个传入的连接尝试
EndAcceptSocket方法异步接受传入的连接尝试,并创建新的Socket来处理远程主机通信
EndAcceptTcpClient方法异步接受传入的连接尝试,并创建新的TcpClient来处理远程主机通信
Start方法开始侦听传入的连接请求
Stop方法关闭侦听器

四、示例

1.源码

// Client // .NET 8.0控制台应用 using System; using System.IO; using System.Net;  using System.Net.Sockets;  namespace _Client {     class Program     {          static void Main(string[] args)         {             TcpClient tcpClient = new();          //创建一个TcpClient对象,自动分配主机IP地址和端口号               tcpClient.Connect("127.0.0.1", 888);  //连接服务器,其IP和端口号为127.0.0.1和888               if (tcpClient != null)                //判断是否连接成功             {                 Console.WriteLine("连接服务器成功");                 NetworkStream networkStream = tcpClient.GetStream();  //获取数据流                 BinaryReader reader = new(networkStream);             //定义流数据读取对象                 BinaryWriter writer = new(networkStream);             //定义流数据写入对象                 string localip = "127.0.0.1";                                               //存储本机IP,默认值为127.0.0.1                 IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());//获取所有IP地址                 foreach (IPAddress ip in ips)                 {                     if (!ip.IsIPv6SiteLocal)         //如果不是IPV6地址                         localip = ip.ToString();     //获取本机IP地址                 }                 writer.Write(localip + " 你好服务器,我是客户端");    //向服务器发送消息                   while (true)                 {                     try                     {                         string strReader = reader.ReadString();     //接收服务器发送的数据                           if (strReader != null)                         {                             Console.WriteLine("来自服务器的消息:" + strReader);//输出接收的服务器消息                         }                     }                     catch                     {                         break;                          //接收过程中如果出现异常,退出循环                       }                 }             }             Console.WriteLine("连接服务器失败");         }     } }  
// Server // .NET 8.0控制台应用 using System.Net; using System.Net.Sockets;  namespace _Server {     class Program     {         static void Main()         {             int port = 888;             TcpClient tcpClient;             IPAddress[] serverIP = Dns.GetHostAddresses("127.0.0.1");   //定义IP地址             IPAddress localAddress = serverIP[0];                       //IP地址               TcpListener tcpListener = new(localAddress, port);          //监听套接字             tcpListener.Start();                                                                                                                                                         //开始监听               Console.WriteLine("服务器启动成功,等待用户接入…");            //输出消息               while (true)             {                 try                 {                     tcpClient = tcpListener.AcceptTcpClient();          //每接收一个客户端则生成一个TcpClient                       NetworkStream networkStream = tcpClient.GetStream();//获取网络数据流                     BinaryReader reader = new(networkStream);           //定义流数据读取对象                     BinaryWriter writer = new(networkStream);           //定义流数据写入对象                     while (true)                     {                         try                         {                             string strReader = reader.ReadString();      //接收消息                             string[] strReaders = strReader.Split([' ']);//截取客户端消息                             Console.WriteLine("有客户端接入,客户IP:" + strReaders[0]);  //输出接收的客户端IP地址                               Console.WriteLine("来自客户端的消息:" + strReaders[1]);        //输出接收的消息                               string strWriter = "我是服务器,欢迎光临";    //定义服务端要写入的消息                             writer.Write(strWriter);                    //向对方发送消息                           }                         catch                         {                             break;                         }                     }                 }                 catch                 {                     break;                 }             }         }     } } 

2.生成效果

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!