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

本文主要是介绍C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、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.1IPAddress[] 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.生成效果

 

这篇关于C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/456438

相关文章

MESH网络全自动全屋覆盖! 小米全屋路由器BE3600 Pro套装评测

《MESH网络全自动全屋覆盖!小米全屋路由器BE3600Pro套装评测》小米全屋路由BE3600Pro网线版,一套“全2.5G口+Mesh配置”的组合,这套路由器到底是神器还是智商税?我们今天就... 目录一、前言:更好用的Wi-Fi 7路由器 不只是更快二php、外观:致敬经典回归初心 复刻初代小米路由器

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求