目录
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