這期內容當中小編將會給大家?guī)碛嘘PC#中如何進行UDP編程補充,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都地區(qū)優(yōu)秀IDC服務器托管提供商(成都創(chuàng)新互聯(lián)).為客戶提供專業(yè)的服務器機柜租用,四川各地服務器托管,服務器機柜租用、多線服務器托管.托管咨詢專線:13518219792
下面就直接介紹實現(xiàn)過程和代碼以及運行的結果。
一、程序實現(xiàn)
UDP廣播程序的實現(xiàn)代碼:
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace UDPBroadcast { /// <summary> /// 在界面上,用戶可以設置本地進程的IP地址和端口號,并將地址加入某個組播組; /// 可以輸入發(fā)送消息的目的組的地址,并且勾選“廣播”復選框將采用廣播的方式發(fā)送信息 /// 在界面上點擊“接受按鈕”就啟動接收線程,這樣程序就可以接收廣播或組播的信息 /// </summary> public partial class UdpBroadcasefrm : Form { private UdpClient sendUdpClient; private UdpClient receiveUdpClient; // 組播IP地址 IPEndPoint broadcastIpEndPoint; public UdpBroadcasefrm() { InitializeComponent(); IPAddress[] ips = DNS.GetHostAddresses(Dns.GetHostName()); tbxlocalip.Text = ips[5].ToString(); tbxlocalport.Text = "8002"; // 默認組,組播地址是有范圍 // 具體關于組播和廣播的介紹參照我上一篇博客UDP編程 // 本地組播組 tbxGroupIp.Text = "224.0.0.1"; // 發(fā)送到的組播組 tbxSendToGroupIp.Text = "224.0.0.1"; } // 設置加入組 private void chkbxJoinGtoup_Click(object sender, EventArgs e) { if (chkbxJoinGtoup.Checked == true) { tbxGroupIp.Enabled = false; } else { tbxGroupIp.Enabled = true; tbxGroupIp.Focus(); } } // 選擇發(fā)送模式后設置 private void chkbxBroadcast_Click(object sender, EventArgs e) { if (chkbxBroadcast.Checked == true) { tbxSendToGroupIp.Enabled = false; } else { tbxSendToGroupIp.Enabled = true; tbxSendToGroupIp.Focus(); } } // 發(fā)送消息 private void btnSend_Click(object sender, EventArgs e) { if (tbxMessageSend.Text == "") { MessageBox.Show("消息內容不能為空!","提示"); return; } // 根據(jù)選擇的模式發(fā)送信息 if (chkbxBroadcast.Checked == true) { // 廣播模式(自動獲得子網中的IP廣播地址) broadcastIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 8002); } else { // 組播模式 broadcastIpEndPoint = new IPEndPoint(IPAddress.Parse(tbxSendToGroupIp.Text), 8002); } // 啟動發(fā)送線程發(fā)送消息 Thread sendThread = new Thread(SendMessage); sendThread.Start(tbxMessageSend.Text); } // 發(fā)送消息 private void SendMessage(object obj) { string message = obj.ToString(); byte[] messagebytes = Encoding.Unicode.GetBytes(message); sendUdpClient = new UdpClient(); // 發(fā)送消息到組播或廣播地址 sendUdpClient.Send(messagebytes, messagebytes.Length, broadcastIpEndPoint); sendUdpClient.Close(); // 清空編輯消息框 ResetMessageText(tbxMessageSend); } // 利用委托回調機制來實現(xiàn)界面上的消息清空操作 delegate void ResetMessageTextCallBack(TextBox textbox); private void ResetMessageText(TextBox textbox) { if (textbox.InvokeRequired) { ResetMessageTextCallBack resetMessageCallback = ResetMessageText; textbox.Invoke(resetMessageCallback, new object[] { textbox }); } else { textbox.Clear(); textbox.Focus(); } } // 接收消息 private void btnReceive_Click(object sender, EventArgs e) { chkbxJoinGtoup.Enabled = false; // 創(chuàng)建接收套接字 IPAddress localIp = IPAddress.Parse(tbxlocalip.Text); IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalport.Text)); receiveUdpClient = new UdpClient(localIpEndPoint); // 加入組播組 if (chkbxJoinGtoup.Checked == true) { receiveUdpClient.JoinMulticastGroup(IPAddress.Parse(tbxGroupIp.Text)); receiveUdpClient.Ttl = 50; } // 啟動接受線程 Thread threadReceive = new Thread(ReceiveMessage); threadReceive.Start(); } // 接受消息方法 private void ReceiveMessage() { IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); while (true) { try { // 關閉receiveUdpClient時此時會產生異常 byte[] receiveBytes = receiveUdpClient.Receive(ref remoteIpEndPoint); string receivemessage = Encoding.Unicode.GetString(receiveBytes); // 顯示消息內容 ShowMessage(lstMessageBox, string.Format("{0}[{1}]", remoteIpEndPoint, receivemessage)); } catch { break; } } } // 通過委托回調機制顯示消息內容 delegate void ShowMessageCallBack(ListBox listbox,string text); private void ShowMessage(ListBox listbox, string text) { if (listbox.InvokeRequired) { ShowMessageCallBack showmessageCallback = ShowMessage; listbox.Invoke(showmessageCallback, new object[] { listbox, text }); } else { listbox.Items.Add(text); listbox.SelectedIndex = listbox.Items.Count - 1; listbox.ClearSelected(); } } // 清空消息列表 private void btnClear_Click(object sender, EventArgs e) { lstMessageBox.Items.Clear(); } // 停止接收 private void btnStop_Click(object sender, EventArgs e) { chkbxJoinGtoup.Enabled =true; receiveUdpClient.Close(); } } }
廣播演示結果(接收端直接點接收按鈕后開啟接受線程,在發(fā)送端勾選“廣播選項”輸入發(fā)送信息點發(fā)送按鈕后的界面如下):
下面通過把接收端加入組后的結果,首先終止接收線程,然后勾選“加入組”復選框,然后單擊“接收”按鈕重新開啟接收線程,輸出結果如下:
從廣播演示的兩個情況可以看出廣播消息會同時向網上的一切進程轉發(fā),無論這個進程是獨立的還是加入了某個組播組中的進程,都可以接收廣播消息
下面演示下組播的結果:
如果把接收端的組地址改為224.0.0.3時,此時發(fā)送端發(fā)送的消息“組播演示2”將不會發(fā)送到不同的組播地址,則接收端就接收不到此時的消息。
從組播結果中可以看出只有加入組播地址224.0.0.2的進程才能接收到信息。
需要注意的地方是:從前面的截圖中可以看出,不論是廣播還是組播,僅僅從收到的信息無從知道發(fā)送給它的進程的端口號,所以廣播和組播消息都是匿名發(fā)送,并且通過對UDP廣播和組播的理解可以簡單實現(xiàn)一個消息群發(fā)的功能(QQ的群里聊天就是這個原理)。
二、 總結
本專題主要是針對上一專題的補充——實現(xiàn)一個簡單的UDP廣播(組播)程序,通過這樣一個發(fā)送端可以發(fā)送給在組播地址中的所有用戶和所有子網中的所有用戶。本專題可以說是對UDP編程的一個擴充吧,希望大家看了本專題后可以對UDP協(xié)議有大致的理解。在下一個專題中會和大家介紹下P2P編程的相關知識。
上述就是小編為大家分享的C#中如何進行UDP編程補充了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當前名稱:C#中如何進行UDP編程補充
本文鏈接:http://aaarwkj.com/article2/igepic.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供移動網站建設、搜索引擎優(yōu)化、ChatGPT、全網營銷推廣、動態(tài)網站、網站排名
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)