C#网络编程(System.Net.Sockets命名空间)

本文详细介绍了C#中的Socket类、TcpClient类、TcpListener类以及UdpClient类的使用,包括它们的属性、方法和示例代码,展示了如何在网络通信中实现连接、发送和接收数据,以及无连接协议的应用。
摘要由CSDN通过智能技术生成

目录

一、Socket类

1.示例源码

2.生成效果

二、TcpClient类和TcpListener类

1.示例源码

2.生成效果

三、UdpClient类

1.示例源码

2.生成效果


        System.Net.Sockets命名空间主要提供制作Sockets网络应用程序的相关类,其中Socket类、TcpClient类、TcpListener类和UdpClient类较为常用。

一、Socket

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

        如果当前使用的是面向连接的协议(如TCP),则服务器可以使用Listen()方法侦听连接;如果当前使用的是无连接协议(如UDP),则根本不需要侦听连接。调用ReceiveFrom()方法可接受任何传入的数据报。使用SendTo()方法可将数据报发送到远程主机。

        Socket类的常用属性及说明如表:

属   性

说    明

AddressFamily

获取Socket的地址族

Available

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

Connected

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

Handle

获取Socket的操作系统句柄

LocalEndPoin

获取本地终结点

ProtocolType

获取Socket的协议类型

RemoteEndPoin

获取远程终结点

SendTimeou

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

        Socket类的常用方法及说明如表:

   方   法

说   明

Accep

为新建连接创建新的Socket

  BeginAccep

开始一个异步操作来接受一个传入的连接尝试

BeginConnect

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

BeginDisconnect

开始异步请求从远程终结点断开连接

BeginReceive

开始从连接的Socket中异步接收数据

BeginSend

将数据异步发送到连接的Socke

BeginSendFile

将文件异步发送到连接的Socket对象

BeginSendTo

向特定远程主机异步发送数据

Close

关闭Socket连接并释放所有关联的资源

   Connect

建立与远程主机的连接

Disconnec

关闭套接字连接并允许重用套接字

EndAccept

异步接受传入的连接尝试

EndConnect

结束挂起的异步连接请求

EndDisconnect

结束挂起的异步断开连接请求

EndReceive

结束挂起的异步读取

EndSend

结束挂起的异步发送

EndSendFile

结束文件的挂起异步发送

EndSendTo

结束挂起的、向指定位置进行的异步发送

Listen

将Socket置于侦听状态

Receive

接收来自绑定的Socket的数据

Send

将数据发送到连接的Socket

   SendFile

将文件和可选数据异步发送到连接的Socket

SendTo

将数据发送到特定终结点

   Shutdown

禁用某Socket上的发送和接收

        示例详见作者文章:

        C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)-CSDN博客  https://blog.csdn.net/wenchm/article/details/134785346?spm=1001.2014.3001.5501

二、TcpClient类和TcpListener

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

☑ 创建一个TcpClient,并调用3个可用的Connect()方法之一。
☑ 使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接。 

        TcpListener类用于在阻止同步模式下侦听和接受传入的连接请求。可使用TcpClient类或Socket类来连接TcpListener,并且可以使用IPEndPoint、本地IP地址及端口号或者仅使用端口号来创建TcpListener实例对象。如果要在同步阻止模式下发送无连接数据报,请使用UdpClient类。

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

属性及方法

说   明

Available属性

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

Client属性

获取或设置基础Socket

Connected属性

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

ReceiveBufferSize属性

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

ReceiveTimeout属性

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

SendBufferSize属性

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

SendTimeout属性

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

BeginConnect()方法

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

Close()方法

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

Connect()方法

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

EndConnect()方法

异步接收传入的连接尝试

GetStream()方法

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

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

属性及方法

说 明

LocalEndpoint 属性

获取当前 TcpListener 的基础 EndPoint

Server 属性

获取基础网络 Socke

AcceptSocket/AcceptTepClient()方法

接受挂起的连接请求

BeginAcceptSocket/BeginAcceptTcpClient()
方法

开始一个异步操作来接收一个传入的连接尝试

EndAcceptSocket()方法

异步接收传入的连接尝试,并创建新的Socket 来处理远程主机通信

EndAcceplTepClient()方法

异步接收传入的连接尝试,并创建新的TcpClient 来处理远程主机通信

Start()方法

开始侦听传入的连接请求

Stop()方法

关闭侦听器

        Stop()方法关闭TcpListenerStop(侦听),但不会关闭任何已接受的连接。

1.示例源码

//TcpClient类和TcpListener类的使用方法
using System.Net;
using System.Net.Sockets;

namespace _08
{
    public partial class Form1 : Form
    {
        private Button? button1;
        private Label? label1;
        private Label? label2;
        private TextBox? textBox1;
        private TextBox? textBox2;
        private RichTextBox? richTextBox1;

        public Form1()
        {
            InitializeComponent();
            Load += Form1_Load;
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(12, 176),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 0,
                Text = "确定",
                UseVisualStyleBackColor = true
            };
            button1.Click += Button1_Click;
            // 
            // label1
            // 
            label1 = new Label
            {
                AutoSize = true,
                Location = new Point(16, 9),
                Name = "label1",
                Size = new Size(43, 17),
                TabIndex = 1,
                Text = "主机IP:"
            };
            // 
            // label2
            // 
            label2 = new Label
            {
                AutoSize = true,
                Location = new Point(16, 45),
                Name = "label2",
                Size = new Size(43, 17),
                TabIndex = 2,
                Text = "端口号:"
            };
            // 
            // textBox1
            // 
            textBox1 = new TextBox
            {
                Location = new Point(75, 6),
                Name = "textBox1",
                Size = new Size(156, 23),
                TabIndex = 3
            };
            // 
            // textBox2
            // 
            textBox2 = new TextBox
            {
                Location = new Point(75, 39),
                Name = "textBox2",
                Size = new Size(156, 23),
                TabIndex = 4
            };
            // 
            // richTextBox1
            // 
            richTextBox1 = new RichTextBox
            {
                Location = new Point(237, 12),
                Name = "richTextBox1",
                Size = new Size(265, 187),
                TabIndex = 5,
                Text = ""
            };
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(514, 211);
            Controls.Add(richTextBox1);
            Controls.Add(textBox2);
            Controls.Add(textBox1);
            Controls.Add(label2);
            Controls.Add(label1);
            Controls.Add(button1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            IPAddress? ipaddress =IPAddress.Parse(textBox1!.Text);    //实例化一个IPAddress对象,用来表示网络IP地址                                           
            int port =Convert.ToInt32(textBox2!.Text);                //定义一个int类型变量,用来存储端口号
            TcpListener? tcplistener = new(ipaddress, port);
            tcplistener.Start();     //开始TcpListener侦听                                
            richTextBox1!.Text = "等待连接…n";
            TcpClient? tcpclient;    //实例化一个TepClient对象,井赋值为空
            if (tcplistener.Pending())//判断是否有挂起的连接请求
            {
                tcpclient = tcplistener.AcceptTcpClient();      //使用AcceptTcpClient初始化TcpClient对象
            }
            else
                tcpclient = new TcpClient(textBox1.Text, port); //使用TcpClient的构造函数初始化TcpClient对象
            richTextBox1.Text += "连接成功!\n"; 
            tcpclient.Close();      //关闭TcpClient连接
            tcplistener.Stop();     //停止TcpListener侦听
        }
    }
}

2.生成效果

三、UdpClient类

        UdpClient类用于在阻止同步模式下发送和接收无连接UDP数据报。因为UDP是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接,但可以选择使用下面两种方法之一来建立默认远程主机。

☑ 使用远程主机名和端口号作为参数创建UdpClient类的实例。
☑ 创建UdpClient类的实例,然后调用Connect()方法。

        如果已指定了默认远程主机,则不要使用主机名或IPEndPoint调用Send()方法,否则将引发异常。

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

属性及方法

说 明

Available 属性

 获取从网络接收的可读取的数据量

Client 属性

 获取或设置基础网络 Socket

BeginReceive()方法

 从远程主机异步接收数据报

BeginSend()方法

 将数据报异步发送到远程主机

Close()方法

 关闭 UDP 连接

Connect()方法

 建立默认远程主机

EndReceive()方法

 结束挂起的异步接收

  EndSend()方法

 结束挂起的异步发送

  Receive()方法

 返回已由远程主机发送的UDP数据报

   Send()方法

 将 UDP数据报发送到远程主机

        示例详见作者文章:

        C#网络编程UDP程序设计(UdpClient类)-CSDN博客  https://blog.csdn.net/wenchm/article/details/134789137?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值