UDP不屬于面向連接的通信,在選擇協議時,選擇UDP必須要謹慎。在網絡質量較差情況下,UDP協議數據包丟失會比較嚴重。但是由于UDP的特性:它不屬于連接型協議,具有資源消耗小,處理速度快等優點,所以通常音視頻和普通數據在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。
通過UDP進行信息收發,并沒有嚴格的客戶端和服務端之分,它不同于TCP,TCP必須建立可靠連接之后才可以通信,而UDP隨時都可以給指定的ip和端口所對應進程發送消息。
UDP發送消息時需要綁定自己IP 和 端口號,接收消息的時候沒有特殊限制,只要有人給自己發送,自己在線,就可以接收。
總之,使用UDP協議進行信息的傳輸之前不需要建立連接。換句話說就是客戶端向服務器發送信息,客戶端只需要給出服務器的ip地址和端口號,然后將信息封裝到一個待發送的報文中并且發送出去。至于服務器端是否存在,或者能否收到該報文,客戶端根本不用管。
Server服務端實現代碼
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace UdpServer
{
class Program
{
static Socket server;
static void Main(string[] args)
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
server.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.101"), 8001)); //綁定端口號和IP
Thread threadReciveMsg = new Thread(ReciveMsg); //開啟接收消息線程
threadReciveMsg.Start();
Thread threadSendMsg = new Thread(sendMsg); //開啟發送消息線程
threadSendMsg.Start();
Console.WriteLine("服務端已開啟");
}
///
/// 向指定IP的主機端口發送數據報
///
static void sendMsg()
{
EndPoint point = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 8000);
while (true)
{
string msg = Console.ReadLine();
server.SendTo(Encoding.UTF8.GetBytes(msg), point);
}
}
///
/// 接收發送給本機ip對應端口號的數據報
///
static void ReciveMsg()
{
while (true)
{
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用來保存發送方的ip和端口號
byte[] buffer = new byte[1024];
int length = server.ReceiveFrom(buffer, ref point);//接收數據報
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine(DateTime.Now.ToString() + " Msg From: " + point.ToString() + ":" + message);
}
}
}
}
審核編輯 :李倩
-
通信
+關注
關注
18文章
6043瀏覽量
136156 -
UDP
+關注
關注
0文章
327瀏覽量
33994 -
代碼
+關注
關注
30文章
4803瀏覽量
68752
原文標題:C# UDP通訊
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論