柚子快報(bào)邀請(qǐng)碼778899分享:網(wǎng)絡(luò)協(xié)議 網(wǎng)絡(luò) UDP協(xié)議
柚子快報(bào)邀請(qǐng)碼778899分享:網(wǎng)絡(luò)協(xié)議 網(wǎng)絡(luò) UDP協(xié)議
Udp的特點(diǎn):
1.無面向連接;
2.延遲小,傳輸效率高;
3.無序,容易丟包;
4.一對(duì)一,一對(duì)多,多對(duì)多;
Udp單播,組播,廣播的區(qū)別:?
?接收方面:
組播和廣播可以接收到發(fā)送端的IP和端口;
廣播和組播在接收時(shí)不需要?jiǎng)?chuàng)建數(shù)組;
特別需要注意的點(diǎn):
1.組播是自定義ip和端口(無論接收還是發(fā)送);
2.廣播沒有ip,只有自定義端口(無論接收還是發(fā)送);
3.廣播發(fā)送端的發(fā)送IP默認(rèn)是(255.255.255.255);
個(gè)人理解:UdpClient:
發(fā)送端的UdpClient udp = new UdpClient(8090);- 是設(shè)置自己的本機(jī)端口,也可以()為空,會(huì)默認(rèn)隨機(jī)。----------為了把自己的端口傳送出去
接收端的UdpClient udp = new UdpClient(8090); ()不能為空,也代表本機(jī)端口,此端口大小和發(fā)送端的發(fā)送端口保持一致;---------為了能接收到?
1.udp協(xié)議的單播接收
private static void Udpreveice()
{
//1.實(shí)例化一個(gè)udp協(xié)議對(duì)象
Socket udp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//2.綁定IP,端口
udp.Bind(new IPEndPoint(IPAddress.Any, 8000));
//3.創(chuàng)建一個(gè)線程
Task.Run(()=>{
//4.創(chuàng)建一個(gè)存儲(chǔ)數(shù)組
byte[] buffer=new byte[1024];
//5.循環(huán)接收數(shù)據(jù)
while(true)
{
//在這里可以接收多個(gè)設(shè)備的數(shù)據(jù)
//當(dāng)接收到數(shù)據(jù)胡時(shí)會(huì)把接受的數(shù)據(jù)發(fā)送到 Endpoint中
//接收多個(gè)設(shè)備的數(shù)據(jù)時(shí),可以用來區(qū)分設(shè)備的IP和端口
//6.用父類來區(qū)分
EndPoint endPoint = new IPEndPoint(0,0);
//7.使用ReceiveFrom 到緩沖區(qū)接收數(shù)據(jù),并存儲(chǔ)總結(jié)點(diǎn)
int lenth=udp.ReceiveFrom(buffer, ref endPoint);
//8.打印接收的數(shù)據(jù)
string str=encoding.GetString(buffer);
Console.WriteLine($"{endPoint}接收到的數(shù)據(jù)"+str);
}
});
}
2.udp協(xié)議的單播發(fā)送
public static void UdpSend()
{
//1.實(shí)例化
Socket udp = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//2.Task線程發(fā)送數(shù)據(jù)
Task.Run(async () => {
//3.創(chuàng)建終結(jié)點(diǎn)
EndPoint endPoint=new IPEndPoint(IPAddress.Parse("192.168.218.21"),8000);
int num = 0;
//4.循環(huán)發(fā)送
while (true)
{
num++;
byte[] buffer = encoding.GetBytes($"你好"+num);
//SendTo 發(fā)送到指定的終結(jié)點(diǎn)
//Send 發(fā)送到已連接的指定的數(shù)據(jù)上
udp.SendTo(buffer, endPoint);
//等待1秒
await Task.Delay(1000);
}
});
});
}
個(gè)人理解記憶:udp單播發(fā)送,接收不必建立連接(使用Connect,Accept),所以需要用到SendTo發(fā)送,ReceiveFrom接收,繼而使用EndPoint來區(qū)分地址,端口
3.Udp協(xié)議的組播接收
//1.自定義IP和端口
IPAddress iPAddress = IPAddress.Parse("235.110.120.119");
UdpClient udp = new UdpClient(8090);
//2.把設(shè)備添加到組中,IP:224.0.0.0-236.255.255.255,
//注意:224.0.0.0-224.255.255.255,這個(gè)范圍不要使用
udp.JoinMulticastGroup(iPAddress);
//3.循環(huán)
Task.Run(() => {
IPEndPoint iPEndPoint = new IPEndPoint(0,0);
while(true)
{
//Receive:返回由---發(fā)送的數(shù)據(jù)
byte[] buffer = udp.Receive(ref iPEndPoint);
string str=encoding.GetString(buffer);
Console.WriteLine($"接收到組播{iPEndPoint}的數(shù)據(jù)"+str);
}
});
注:組播可以接收到發(fā)送者的id和端口
4.Udp協(xié)議的組播發(fā)送
private static void MulticastSend()
{
//
IPAddress iPAddress = IPAddress.Parse("235.110.120.119");
UdpClient udp = new UdpClient(8099);//
udp.JoinMulticastGroup(iPAddress);
Task.Run(async () => {
int num = 0;
IPEndPoint iPEndPoint=new IPEndPoint(iPAddress, 8090);
while (true)
{
num++;
byte[] bytes = encoding.GetBytes("靠你西瓦"+num);
udp.Send(bytes, bytes.Length, iPEndPoint);
await Task.Delay(1000);
}
});
5.udp協(xié)議的廣播接收
private static void BroadcastReceive()
{
//1.只有端口
UdpClient udp=new UdpClient(9500)
Task.Run(()=>{
while(true)
{
//在廣播中不需要?jiǎng)?chuàng)建數(shù)組
IPEndPoint endpoint=new IPEndPoint(0,0);
byte[] buffer=udp.Receive(ref endpoint);
string str=encoding.GetString(buffer);
ConSole.WriteLine($"接收到的廣播{endpoint}:+str");
}
});
}
6.udp協(xié)議的廣播發(fā)送
public static void BroadcastSend()
{
//本機(jī)端口
UdpClient udp= new UdpClient();
Task((async)=>{
int num=0;
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"),9500);
while(true)
{
num++;
udp.Send(encoding.Getbyte("我是廣播"+num));
await Task.Delay(1000);
}
});
}
柚子快報(bào)邀請(qǐng)碼778899分享:網(wǎng)絡(luò)協(xié)議 網(wǎng)絡(luò) UDP協(xié)議
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。