UDP不屬於面向連線的通訊,在選擇使用協議的時候,選擇UDP必須要謹慎。在網路質量令人十分不滿意的環境下,UDP協議資料包丟失會比較嚴重。但是由於UDP的特性:它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。
我們通過UDP進行資訊收發的時候,沒有嚴格客戶端和服務端的區別,它不同於UDP,UDP 必須建立可靠連線之後才可以通訊,而UDP隨時都可以給指定的ip和埠所對應程序傳送訊息。UDP傳送訊息時需要繫結自己IP 和 埠號,接收訊息的時候沒有特殊限制,只要有人給自己傳送,自己線上,就可以接收。
(網上例子很多,但是總有一點地方看不懂。下面附上我的小例子,僅供參考。)
傳送端:
using System;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net; namespace client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} //初始化一個UdpClient的新例項
UdpClient sendUdpClient = new UdpClient(); //單擊事件
private void btn_send_Click(object sender, EventArgs e)
{
string message = txt_sendmsg.Text; if(string.IsNullOrEmpty(message))
{
MessageBox.Show("傳送內容不能為空!");
txt_sendmsg.Focus();
return;
} //用指定IP地址和埠號初始化IPEndPoint類的新例項
IPEndPoint local = new IPEndPoint(IPAddress.Parse("127.0.0.1"), ); //將資料報傳送至指定主機
sendUdpClient.Send(Encoding.UTF8.GetBytes(message), message.Length, local); }
}
}
接收端:
using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
//初始化新執行緒用來接收訊息
Thread myThread = new Thread(ReceiveMsg); //設為後臺執行緒
myThread.IsBackground = true; //開啟執行緒
myThread.Start();
} private UdpClient receiveUdpClient; private const int port = ; IPAddress ip = IPAddress.Parse("127.0.0.1"); //接收訊息
private void ReceiveMsg()
{
//用指定IP地址和埠號初始化IPEndPoint類的新例項
IPEndPoint local = new IPEndPoint(ip, port); //初始化一個UdpClient的新例項並繫結到本地
receiveUdpClient = new UdpClient(local); while(true)
{
try
{
//返回由主機發來的資料報
byte[] receiveBytes = receiveUdpClient.Receive(ref local); string receivemsg = Encoding.UTF8.GetString(receiveBytes, , receiveBytes.Length);
ShowMessage(lst_receivemsg, receivemsg);
}
catch
{
break;
}
}
} // 通過委託回撥機制顯示訊息內容
delegate void ShowMessageDelegate(ListBox listbox, string text); private void ShowMessage(ListBox listbox, string text)
{
//如果控制元件的 Handle 是在與呼叫執行緒不同的執行緒上建立的(此時,您必須通過 Invoke 方法對控制元件進行呼叫),則為 true;否則為 false。
//如果從另一個執行緒呼叫控制元件的方法,那麼必須使用控制元件的一個 Invoke 方法來將呼叫封送到適當的執行緒。
if (listbox.InvokeRequired)
{
ShowMessageDelegate d = ShowMessage;
listbox.Invoke(d, new object[] { listbox, text });
}
else
{
listbox.Items.Add(text);
}
}
}
}