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.生成效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react-flip-move结合array-move实现前端列表置顶效果

你有没有遇到这样的需求?点击左侧列表项,则像聊天会话窗口一样将被点击的列表项置顶。 如果只是单纯的置顶的话,直接使用array-move就可以实现了,但置顶效果多少有点突兀~ 先上代码,直接使用array-move的情况&#xf…

数据可视化私有化部署:为何成本居高不下?

尽管在可视化设计这行干了好多年,也接手过不少项目,但昂贵的私有化部署费用总能让我发出由衷的感叹:“这几十万一年也太贵了!”。可以预见,数据可视化软件私有化部署所带来的高昂成本,将是许多企业面临的问…

Jmeter进行压力测试不为人知的秘密

jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免…

每日一练【快乐数】

一、题目描述 202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这…

Elasticsearch高级

文章目录 一.数据聚合二.RestAPI实现聚合三.ES自动补全(联想)四.数据同步五.elasticsearch集群 一.数据聚合 在ES中的数据聚合(aggregations)可以近似看做成mysql中的groupby分组,聚合可以实现对文档数据的统计、分析、运算,常见的聚合的分类有以下几种…

基于APM(PIX)飞控和mission planner制作遥控无人车-从零搭建自主pix无人车普通舵机转向无人车-1(以乐迪crossflight飞控为例)

1.前期准备 准备通过舵机转向的无人车地盘、遥控器、地面站电脑、飞控等。安装驱动程序、端口程序、netframwork等,不再赘述。 2.安装固件 安装ardurover固件,如果在线失败,选择官方最新的固件下载到本地,选择本地安装。 3.调试…

智能仓库PTL管理系统

清晰电子墨水屏显示,无纸化作业,超低功耗 无线通信,穿透力强,极简部署 支持声光提醒,极大提高作业效率 适用场景:工厂,仓库,物流,货品分类等等

认识Docker

Docker 是世界领先的软件容器平台,所以想要搞懂 Docker 的概念我们必须先从容器开始说起。 1.1 什么是容器? 先来看看容器较为官方 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的…

希宝猫罐头怎么样?专业人士告诉你质量好又便宜的猫罐头推荐

作为从业6年的宠物护理师来说,只买合适的,贵的不如好的,只要配方不出错营养跟得上,观察自家猫咪体质真的基本不怎么出错。希望大家看完这篇文章,各位铲屎官都能买到满意的猫罐头。那么希宝猫罐头在各方面表现怎么样呢&…

UI咨询公司-蓝蓝设计:顶级秘籍:提升UI设计吸引力的3大绝招

想要让你的UI设计在海量应用中脱颖而出,吸引用户眼球吗?如果你正在寻找提升UI设计吸引力的绝妙方法,那么你绝对不能错过本文!我们将为你揭示顶级UI设计师都不会告诉你的3大绝招,让你轻松掌握提升UI设计吸引力的关键技巧…

网络运维与网络安全 学习笔记2023.11.30

网络运维与网络安全 学习笔记 第三十一天 今日目标 实现AP自动注册、配置WLAN业务参数、无线终端通过wifi互访 实现AP自动注册 项目背景 企业内网的大量AP已经通过DHCP的方式获得IP地址 为了实现后期大量AP的统一管理,希望通过AC实现集中控制 在AC设备上&#…

SpringBoot框架结合Redis实现分布式锁

一、SpringBoot结合 Redis实现分布式锁 1.1、什么是分布式锁 分布式锁,是在分布式的环境下,才会使用到的一种同步访问机制,在传统的单体环境里面,不存在分布式锁的概念,只有在分布式环境里面,才有分布式锁…

赴日程序员高年薪过上“躺平”生活?

日本的IT行业想要达到的高薪,也是需要很多资历和经验的,不过即使你是新卒,也能拿到相比国内来说让你满意的薪资。 刚入职的起薪是20-23万日元/月,情报信息业出身,技术掌握不错,起薪是25万-30万日元。之后经…

git的安装及ssh配置(Linux)

环境 CentOS Linux release 7.9.2009 (Core) Xftp7 安装 方法一:yum安装 yum是一个客户端软件,就好比手机上的应用商店,帮助我们对软件的下载、安装和卸载 1、首先查看自己是否安装过git [rootxiaoxi ~]# git -bash: git: command not fo…

C++继承(详解)

一、继承的概念 1.1、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结…

【JavaEE】单例模式

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…

Python容器——字典

Key——Value 键值对

科技云报道:AI+PaaS,中国云计算市场迎来新“变量”?

科技云报道原创。 没有小的市场,只有还没有被发现的大生意。 随着企业数字化转型的逐级深入,市场需求进一步向PaaS和SaaS层进发,使之成为公有云服务市场增长的主要动力。 根据IDC最新发布的报告显示,2022-2027五年间中国公有云…

初识计算机网络

网络通信基础 1. IP地址2.端口号3.认识协议3.1协议分层 4. 网络数据传输的基本流程4.1 五元组4.2封装和分用 1. IP地址 IP地址主要用于表示网络主机,其他网络设备的网络地址,IP地址用于定位主机的网络地址 比如:发送快递的时候,需要知道对象的收货地址,才能将包裹送到目的地. …