目錄
一、UdpClient類?
二、示例
1.源碼
(1)Client
(2)Server
2.生成
(1)先啟動服務(wù)器,發(fā)送廣播信息
(2)再開啟客戶端接聽
???????UDP是user datagram protocol的簡稱,中文名是用戶數(shù)據(jù)報協(xié)議,它是網(wǎng)絡(luò)信息傳輸?shù)牧硪环N形式。UDP通信和TCP通信不同,基于UDP的信息傳遞更快,但不提供可靠的保證。使用UDP傳遞數(shù)據(jù)時,用戶無法知道數(shù)據(jù)能否正確地到達(dá)主機(jī),也不能確定到達(dá)目的地的順序是否和發(fā)送的順序相同。
????????雖然UDP是一種不可靠的協(xié)議,但如果需要較快地傳輸信息,并能容忍小的錯誤,可以考慮使用UDP。基于UDP通信的基本模式如下:
- 將數(shù)據(jù)打包(稱為數(shù)據(jù)包),然后將數(shù)據(jù)包發(fā)往目的地。
- 接收別人發(fā)來的數(shù)據(jù)包,然后查看數(shù)據(jù)包。
????????在C#中,UdpClient類用于在阻止同步模式下發(fā)送和接收無連接UDP數(shù)據(jù)報。因為UDP是無連傳輸協(xié)議,所以不需要在發(fā)送和接收數(shù)據(jù)前建立遠(yuǎn)程主機(jī)連接,但可以選擇使用下面兩種方法之一建立默認(rèn)遠(yuǎn)程主機(jī)。
- 使用遠(yuǎn)程主機(jī)名和端口號作為參數(shù)創(chuàng)建UdpClient類的實例。
- 創(chuàng)建UdpClient類的實例,然后調(diào)用Connect方法。? ?
一、UdpClient類?
????????UdpClient類的常用屬性、方法及說明如表:
屬性及方法 | 說明 |
Available屬性 | 獲取從網(wǎng)絡(luò)接收的可讀取的數(shù)據(jù)量 |
Client屬性 | 獲取或設(shè)置基礎(chǔ)網(wǎng)絡(luò)Socket |
BeginReceive方法 | 從遠(yuǎn)程主機(jī)異步接收數(shù)據(jù)報 |
BeginSend方法 | 將數(shù)據(jù)報異步發(fā)送到遠(yuǎn)程主機(jī) |
Close方法 | 關(guān)閉UDP連接 |
Connect方法 | 建立默認(rèn)遠(yuǎn)程主機(jī) |
EndReceive方法 | 結(jié)束掛起的異步接收 |
EndSend方法 | 結(jié)束掛起的異步發(fā)送 |
Receive方法 | 返回已由遠(yuǎn)程主機(jī)發(fā)送的UDP數(shù)據(jù)報 |
Send方法 | 將UDP數(shù)據(jù)報發(fā)送到遠(yuǎn)程主機(jī) |
EnableBroadcast屬性 | 是否接收或發(fā)送廣播 |
Active屬性 | 獲取或者設(shè)置一個值指示是否已建立默認(rèn)遠(yuǎn)程主機(jī) |
JoinMulticastGroup方法 | 將UdpClient添加到多路廣播組 |
DropMulticastGroup方法 | 將UdpClient退出多路廣播組 |
二、示例
1.源碼
(1)Client
// Client
// 創(chuàng)建接收廣播項目Clent(Windows窗體應(yīng)用程序),
// 單擊“開始接收”按鈕,系統(tǒng)開始接收主機(jī)播出的信息;
// 單擊“停止接收”按鈕,系統(tǒng)會停止接收廣播主機(jī)播出的信息。
using System.Net.Sockets;
using System.Net;
using System.Text;
namespace Client
{
public partial class Form1 : Form
{
private Button? button1;
private Button? button2;
private TextBox? textBox1;
private TextBox? textBox2;
public Form1()
{
InitializeComponent();
Load += new EventHandler(Form1_Load);
CheckForIllegalCrossThreadCalls = false; //在其他線程中可以調(diào)用主窗體控件
}
private CancellationTokenSource? cancellationToken1;
private bool flag = true; //定義一個bool變量,標(biāo)識是否接收數(shù)據(jù)
private UdpClient? udp; //創(chuàng)建UdpClient對象
private Thread? thread; //創(chuàng)建線程對象
private void Form1_Load(object? sender, EventArgs e)
{
//
// button1
//
button1 = new Button
{
BackColor = Color.Red,
FlatStyle = FlatStyle.Flat,
Font = new Font("宋體", 10F, FontStyle.Bold, GraphicsUnit.Point, 134),
Location = new Point(228, 5),
Name = "button1",
Size = new Size(85, 32),
TabIndex = 0,
Text = "開始接收",
UseVisualStyleBackColor = false
};
button1.FlatAppearance.BorderSize = 0;
button1.Click += new EventHandler(Button1_Click);
//
// button2
//
button2 = new Button
{
BackColor = Color.Yellow,
FlatStyle = FlatStyle.Flat,
Font = new Font("宋體", 10F, FontStyle.Bold, GraphicsUnit.Point, 134),
Location = new Point(319, 5),
Name = "button2",
Size = new Size(85, 32),
TabIndex = 1,
Text = "停止接收",
UseVisualStyleBackColor = false
};
button2.FlatAppearance.BorderSize = 0;
button2.Click += new EventHandler(Button2_Click);
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(7, 54),
Multiline = true,
Name = "textBox1",
ScrollBars = ScrollBars.Both,
Size = new Size(311, 133),
TabIndex = 2
};
//
// textBox2
//
textBox2 = new TextBox
{
ForeColor = Color.Blue,
Location = new Point(319, 54),
Multiline = true,
Name = "textBox2",
ScrollBars = ScrollBars.Both,
Size = new Size(306, 133),
TabIndex = 3
};
//
// Form1
//
AutoScaleDimensions = new SizeF(6F, 12F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(638, 193);
Controls.Add(textBox2);
Controls.Add(textBox1);
Controls.Add(button2);
Controls.Add(button1);
Name = "Form1";
StartPosition = FormStartPosition.CenterScreen;
Text = "Client";
}
private void Button1_Click(object? sender, EventArgs e)
{
udp = new UdpClient(888);
flag = true;
IPEndPoint ipendpoint = new(IPAddress.Any, 888); //創(chuàng)建IPEndPoint對象,用來顯示響應(yīng)主機(jī)的標(biāo)識
thread = new Thread(() => //新開線程,執(zhí)行接收數(shù)據(jù)操作
{
while (flag)
{
try
{
if (udp.Available <= 0) continue; //判斷是否有網(wǎng)絡(luò)數(shù)據(jù)
if (udp.Client == null) return; //判斷連接是否為空
byte[] bytes = udp.Receive(ref ipendpoint); //調(diào)用UdpClient對象的Receive方法獲得從遠(yuǎn)程主機(jī)返回的UDP數(shù)據(jù)報
string str = Encoding.Default.GetString(bytes);//將獲得的UDP數(shù)據(jù)報轉(zhuǎn)換為字符串形式
textBox1!.Text = "正在接收的信息:\n" + str; //顯示正在接收的數(shù)據(jù)
textBox2!.Text += "\n" + str; //顯示接收的所有數(shù)據(jù)
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);//錯誤提示
}
Thread.Sleep(1000); //線程休眠1秒
}
});
thread.Start(); //啟動線程
}
private void Button2_Click(object? sender, EventArgs e)
{
cancellationToken1 = new CancellationTokenSource();
flag = false; //不接收數(shù)據(jù)
if (thread!.ThreadState == ThreadState.Running) //判斷線程是否運行
cancellationToken1.Cancel(); //關(guān)閉線程
udp!.Close(); //關(guān)閉連接
}
}
}
(2)Server
// Server,先開Server后開Client
// 廣播數(shù)據(jù)報程序
// 創(chuàng)建廣播主機(jī)項目Server(控制臺應(yīng)用程序),在Main()方法中創(chuàng)建UDP連接;
// 然后通過UDP 不斷向外發(fā)送廣播信息。
using System.Text;
using System.Net.Sockets;
namespace Server
{
class Program
{
static readonly UdpClient udp = new();// 創(chuàng)建UdpClient對象
static void Main(string[] args)
{
udp.Connect("127.0.0.1", 888); //調(diào)用UdpClient對象的Connect方法建立默認(rèn)遠(yuǎn)程主機(jī)
while (true)
{
Thread thread = new(() =>
{
try
{
string str = "(" + DateTime.Now.ToLongTimeString();
str += ")節(jié)目預(yù)報:八點有大型晚會,請收聽";
byte[] sendBytes = Encoding.Default.GetBytes(str); //定義一個字節(jié)數(shù)組,用來存放發(fā)送到遠(yuǎn)程主機(jī)的信息
Console.WriteLine(str);
udp.Send(sendBytes, sendBytes.Length); //調(diào)用UdpClient對象的Send方法將UDP數(shù)據(jù)報發(fā)送到遠(yuǎn)程主機(jī)
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
});
thread.Start(); //啟動線程
Thread.Sleep(1000);//線程休眠1秒
}
}
}
}
2.生成
(1)先啟動服務(wù)器,發(fā)送廣播信息
?文章來源:http://www.zghlxwxcb.cn/news/detail-852557.html
(2)再開啟客戶端接聽
文章來源地址http://www.zghlxwxcb.cn/news/detail-852557.html
到了這里,關(guān)于C#網(wǎng)絡(luò)編程UDP程序設(shè)計(UdpClient類)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!