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

c# tcp通讯类库,网络,c#,tcp/ip

 文章来源地址https://www.toymoban.com/news/detail-764113.html

到了这里,关于C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】网络编程套接字(三)TCP网络程序

    与前边的UDP网络程序相同,创建套接字的接口都是socket,下边对socket接口进行介绍: 协议家族选择AF_INET,因为我们要进行网络通信。 而第二个参数,为服务类型,传入SOCK_STREAM,我们编写TCP程序,所以要选择流式的服务。 第三个参数默认传入0,由前两个参数就可以推出这是

    2024年02月16日
    浏览(27)
  • 网络编程 -- 简易TCP网络程序

      字符串回响程序类似于 echo 指令,客户端向服务器发送消息,服务器在收到消息后会将消息发送给客户端,该程序实现起来比较简单,同时能很好的体现 socket 套接字编程的流程。      这个程序我们已经基于 UDP 协议实现过了,换成 TCP 协议实现时,程序的结构是没有变化

    2024年04月25日
    浏览(23)
  • 网络编程『简易TCP网络程序』

    🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 随着数字时代的来临,TCP网络程序已成为程序员不可或缺的技术领域。本博客将带领读者深入研究,从最基础的字符串回响开始,逐步探索至多进程、多线程服务器

    2024年02月04日
    浏览(25)
  • 网络编程套接字(2)——简单的TCP网络程序

    我们将TCP服务器封装成一个类,当我们定义出一个服务器对象后需要马上对服务器进行初始化,而初始化TCP服务器要做的第一件事就是创建套接字。 TCP服务器在调用socket函数创建套接字时,参数设置如下: 协议家族选择 AF_INET ,因为我们要进行的是网络通信。 创建套接字时

    2024年02月06日
    浏览(28)
  • 网络编程——基于TCP协议的通讯录【课程设计】

    题目:基于TCP协议的通讯录 设计目标: (1)了解Socket通信的原理,在此基础上编写一个基于TCP协议的通讯录; (2)理解TCP通信原理; 课程设计系统组成及模块功能: 此TCP/IP课程设计实现了基于TCP的客户/服务器通信程序,需要实现以下一些基本功能: (1)客户端连接服务

    2024年02月06日
    浏览(45)
  • 「网络编程」第二讲:网络编程socket套接字(三)_ 简单TCP网络通信程序的实现

    「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(二),下面开始讲解!  「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「每篇一句」 I do not know where to go,but I have been on the road. 我不知

    2024年02月11日
    浏览(26)
  • 【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)

    在前一篇文章中,我们详细介绍了UDP协议和TCP协议的特点以及它们之间的异同点。 本文将延续上文内容,重点讨论简单的TCP网络程序模拟实现 。通过本文的学习,读者将能够深入了解TCP协议的实际应用,并掌握如何编写简单的TCP网络程序。让我们一起深入探讨TCP网络程序的

    2024年04月14日
    浏览(30)
  • Linux网络编程之TCP/IP实现高并发网络服务器设计指南

    目录 引言: 多进程服务器 例程分享: 多线程服务器  例程分享: I/O多路复用服务器 select 例程分享: poll 例程分享: epoll 例程分享: 总结建议         随着互联网的迅猛发展,服务器面临着越来越多的并发请求。如何设计一个能够高效处理大量并发请求的服务器成为

    2024年02月20日
    浏览(31)
  • 互联网编程之多线程/线程池TCP服务器端程序设计

    目录 需求 多线程TCP服务器 线程池TCP服务器 测试 日志模块 多线程TCP服务器(30分): 设计编写一个TCP服务器端程序,需使用多线程处理客户端的连接请求。客户端与服务器端之间的通信内容,以及服务器端的处理功能等可自由设计拓展,无特别限制和要求。 线程池TCP服务器

    2024年02月11日
    浏览(19)
  • 网络编程:TCP粘包问题——各层粘包/拆包、Nagle 算法、Go实现长度字段协议解决TCP粘包、使用TCP的应用层协议设计

    1.1 TCP介绍 如上图,TCP具有面向连接、可靠、基于字节流三大特点。 字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。纯裸TCP收发的这些 01 串之间是没有任何边界的,你根本不知道到哪个地方才算一条完

    2024年02月04日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包