自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#網(wǎng)絡(luò)編程系列七:UDP編程補(bǔ)充

開發(fā) 后端
上次因?yàn)闀r(shí)間的關(guān)系,所以把上一個(gè)專題遺留下的一個(gè)問題在本專題中和大家分享下,本專題主要介紹下如何實(shí)現(xiàn)UDP廣播的程序,下面就直接介紹實(shí)現(xiàn)過程和代碼以及運(yùn)行的結(jié)果。

上次因?yàn)闀r(shí)間的關(guān)系,所以把上一個(gè)專題遺留下的一個(gè)問題在本專題中和大家分享下,本專題主要介紹下如何實(shí)現(xiàn)UDP廣播的程序,下面就直接介紹實(shí)現(xiàn)過程和代碼以及運(yùn)行的結(jié)果。

一、程序?qū)崿F(xiàn)

UDP廣播程序的實(shí)現(xiàn)代碼:

  1. using System;  
  2. using System.Net;  
  3. using System.Net.Sockets;  
  4. using System.Text;  
  5. using System.Threading;  
  6. using System.Windows.Forms;  
  7. namespace UDPBroadcast  
  8. {  
  9.     /// <summary>  
  10.     /// 在界面上,用戶可以設(shè)置本地進(jìn)程的IP地址和端口號,并將地址加入某個(gè)組播組;  
  11.     /// 可以輸入發(fā)送消息的目的組的地址,并且勾選“廣播”復(fù)選框?qū)⒉捎脧V播的方式發(fā)送信息  
  12.     /// 在界面上點(diǎn)擊“接受按鈕”就啟動(dòng)接收線程,這樣程序就可以接收廣播或組播的信息  
  13.     /// </summary>  
  14.     public partial class UdpBroadcasefrm : Form  
  15.     {  
  16.         private UdpClient sendUdpClient;  
  17.         private UdpClient receiveUdpClient;  
  18.         // 組播IP地址  
  19.         IPEndPoint broadcastIpEndPoint;  
  20.         public UdpBroadcasefrm()  
  21.         {  
  22.             InitializeComponent();  
  23.             IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());  
  24.             tbxlocalip.Text = ips[5].ToString();  
  25.             tbxlocalport.Text = "8002";  
  26.             // 默認(rèn)組,組播地址是有范圍  
  27.             // 具體關(guān)于組播和廣播的介紹參照我上一篇博客UDP編程  
  28.             // 本地組播組  
  29.             tbxGroupIp.Text = "224.0.0.1";  
  30.             // 發(fā)送到的組播組  
  31.             tbxSendToGroupIp.Text = "224.0.0.1";  
  32.         }  
  33.  
  34.         // 設(shè)置加入組  
  35.         private void chkbxJoinGtoup_Click(object sender, EventArgs e)  
  36.         {  
  37.             if (chkbxJoinGtoup.Checked == true)  
  38.             {  
  39.                 tbxGroupIp.Enabled = false;  
  40.             }  
  41.             else 
  42.             {  
  43.                 tbxGroupIp.Enabled = true;  
  44.                 tbxGroupIp.Focus();  
  45.             }  
  46.         }  
  47.  
  48.         // 選擇發(fā)送模式后設(shè)置  
  49.         private void chkbxBroadcast_Click(object sender, EventArgs e)  
  50.         {  
  51.             if (chkbxBroadcast.Checked == true)  
  52.             {  
  53.                 tbxSendToGroupIp.Enabled = false;  
  54.             }  
  55.             else 
  56.             {  
  57.                 tbxSendToGroupIp.Enabled = true;  
  58.                 tbxSendToGroupIp.Focus();  
  59.             }  
  60.         }  
  61.  
  62.         // 發(fā)送消息  
  63.         private void btnSend_Click(object sender, EventArgs e)  
  64.         {  
  65.             if (tbxMessageSend.Text == "")  
  66.             {  
  67.                 MessageBox.Show("消息內(nèi)容不能為空!","提示");  
  68.                 return;  
  69.             }  
  70.  
  71.             // 根據(jù)選擇的模式發(fā)送信息  
  72.             if (chkbxBroadcast.Checked == true)  
  73.             {  
  74.                 // 廣播模式(自動(dòng)獲得子網(wǎng)中的IP廣播地址)  
  75.                 broadcastIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 8002);  
  76.             }  
  77.             else 
  78.             {  
  79.                 // 組播模式  
  80.                 broadcastIpEndPoint = new IPEndPoint(IPAddress.Parse(tbxSendToGroupIp.Text), 8002);  
  81.             }  
  82.  
  83.             // 啟動(dòng)發(fā)送線程發(fā)送消息  
  84.             Thread sendThread = new Thread(SendMessage);  
  85.             sendThread.Start(tbxMessageSend.Text);  
  86.         }  
  87.  
  88.         // 發(fā)送消息  
  89.         private void SendMessage(object obj)  
  90.         {  
  91.             string message = obj.ToString();  
  92.             byte[] messagebytes = Encoding.Unicode.GetBytes(message);  
  93.             sendUdpClient = new UdpClient();  
  94.             // 發(fā)送消息到組播或廣播地址  
  95.             sendUdpClient.Send(messagebytes, messagebytes.Length, broadcastIpEndPoint);  
  96.             sendUdpClient.Close();  
  97.               
  98.             // 清空編輯消息框  
  99.             ResetMessageText(tbxMessageSend);  
  100.         }  
  101.  
  102.         // 利用委托回調(diào)機(jī)制來實(shí)現(xiàn)界面上的消息清空操作  
  103.         delegate void ResetMessageTextCallBack(TextBox textbox);  
  104.         private void ResetMessageText(TextBox textbox)  
  105.         {  
  106.             if (textbox.InvokeRequired)  
  107.             {  
  108.                 ResetMessageTextCallBack resetMessageCallback = ResetMessageText;  
  109.                 textbox.Invoke(resetMessageCallback, new object[] { textbox });  
  110.             }  
  111.             else 
  112.             {  
  113.                 textbox.Clear();  
  114.                 textbox.Focus();  
  115.             }  
  116.         }  
  117.  
  118.         // 接收消息  
  119.         private void btnReceive_Click(object sender, EventArgs e)  
  120.         {  
  121.             chkbxJoinGtoup.Enabled = false;  
  122.             // 創(chuàng)建接收套接字  
  123.             IPAddress localIp = IPAddress.Parse(tbxlocalip.Text);  
  124.             IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalport.Text));  
  125.             receiveUdpClient = new UdpClient(localIpEndPoint);  
  126.             // 加入組播組  
  127.             if (chkbxJoinGtoup.Checked == true)  
  128.             {  
  129.                 receiveUdpClient.JoinMulticastGroup(IPAddress.Parse(tbxGroupIp.Text));  
  130.                 receiveUdpClient.Ttl = 50;  
  131.             }  
  132.             // 啟動(dòng)接受線程  
  133.             Thread threadReceive = new Thread(ReceiveMessage);  
  134.             threadReceive.Start();  
  135.         }  
  136.  
  137.         // 接受消息方法  
  138.         private void ReceiveMessage()  
  139.         {  
  140.             IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);  
  141.             while (true)  
  142.             {  
  143.                 try 
  144.                 {  
  145.                     // 關(guān)閉receiveUdpClient時(shí)此時(shí)會(huì)產(chǎn)生異常  
  146.                     byte[] receiveBytes = receiveUdpClient.Receive(ref remoteIpEndPoint);  
  147.                     string receivemessage = Encoding.Unicode.GetString(receiveBytes);  
  148.  
  149.                     // 顯示消息內(nèi)容  
  150.                     ShowMessage(lstMessageBox, string.Format("{0}[{1}]", remoteIpEndPoint, receivemessage));  
  151.                 }  
  152.                 catch 
  153.                 {  
  154.                     break;  
  155.                 }  
  156.             }  
  157.         }  
  158.         // 通過委托回調(diào)機(jī)制顯示消息內(nèi)容  
  159.         delegate void ShowMessageCallBack(ListBox listbox,string text);  
  160.         private void ShowMessage(ListBox listbox, string text)  
  161.         {  
  162.             if (listbox.InvokeRequired)  
  163.             {  
  164.                 ShowMessageCallBack showmessageCallback = ShowMessage;  
  165.                 listbox.Invoke(showmessageCallback, new object[] { listbox, text });  
  166.             }  
  167.             else 
  168.             {  
  169.                 listbox.Items.Add(text);  
  170.                 listbox.SelectedIndex = listbox.Items.Count - 1;  
  171.                 listbox.ClearSelected();  
  172.             }  
  173.         }  
  174.  
  175.         // 清空消息列表  
  176.         private void btnClear_Click(object sender, EventArgs e)  
  177.         {  
  178.             lstMessageBox.Items.Clear();  
  179.         }  
  180.  
  181.         // 停止接收  
  182.         private void btnStop_Click(object sender, EventArgs e)  
  183.         {  
  184.             chkbxJoinGtoup.Enabled =true;  
  185.             receiveUdpClient.Close();  
  186.         }    
  187.     }  

廣播演示結(jié)果(接收端直接點(diǎn)接收按鈕后開啟接受線程,在發(fā)送端勾選“廣播選項(xiàng)”輸入發(fā)送信息點(diǎn)發(fā)送按鈕后的界面如下):

下面通過把接收端加入組后的結(jié)果,首先終止接收線程,然后勾選“加入組”復(fù)選框,然后單擊“接收”按鈕重新開啟接收線程,輸出結(jié)果如下:

從廣播演示的兩個(gè)情況可以看出廣播消息會(huì)同時(shí)向網(wǎng)上的一切進(jìn)程轉(zhuǎn)發(fā),無論這個(gè)進(jìn)程是獨(dú)立的還是加入了某個(gè)組播組中的進(jìn)程,都可以接收廣播消息

下面演示下組播的結(jié)果:

如果把接收端的組地址改為224.0.0.3時(shí),此時(shí)發(fā)送端發(fā)送的消息“組播演示2”將不會(huì)發(fā)送到不同的組播地址,則接收端就接收不到此時(shí)的消息。

從組播結(jié)果中可以看出只有加入組播地址224.0.0.2的進(jìn)程才能接收到信息。

需要注意的地方是:從前面的截圖中可以看出,不論是廣播還是組播,僅僅從收到的信息無從知道發(fā)送給它的進(jìn)程的端口號,所以廣播和組播消息都是匿名發(fā)送,并且通過對UDP廣播和組播的理解可以簡單實(shí)現(xiàn)一個(gè)消息群發(fā)的功能(QQ的群里聊天就是這個(gè)原理)。

二、 總結(jié)

本專題主要是針對上一專題的補(bǔ)充——實(shí)現(xiàn)一個(gè)簡單的UDP廣播(組播)程序,通過這樣一個(gè)發(fā)送端可以發(fā)送給在組播地址中的所有用戶和所有子網(wǎng)中的所有用戶。本專題可以說是對UDP編程的一個(gè)擴(kuò)充吧,希望大家看了本專題后可以對UDP協(xié)議有大致的理解。在下一個(gè)專題中會(huì)和大家介紹下P2P編程的相關(guān)知識。

 全部源碼地址:http://files.cnblogs.com/zhili/UDPBroadcast.zip

原文鏈接:http://www.cnblogs.com/zhili/archive/2012/09/03/UDPBroadcas.html

【編輯推薦】

  1. C#網(wǎng)絡(luò)編程系列一:網(wǎng)絡(luò)協(xié)議簡介
  2. C#網(wǎng)絡(luò)編程系列二:HTTP協(xié)議詳解
  3. C#網(wǎng)絡(luò)編程系列三:自定義Web服務(wù)器
  4. C#網(wǎng)絡(luò)編程系列四:自定義Web瀏覽器
  5. C#網(wǎng)絡(luò)編程系列五:TCP編程
  6. C#網(wǎng)絡(luò)編程系列六:UDP編程
  7. C#網(wǎng)絡(luò)編程系列八:P2P編程
  8. C#網(wǎng)絡(luò)編程系列九:類似QQ的即時(shí)通信程序
  9. C#網(wǎng)絡(luò)編程系列十:實(shí)現(xiàn)簡單的郵件收發(fā)器

 

責(zé)任編輯:張偉 來源: Learning hard的博客
相關(guān)推薦

2012-09-24 15:35:24

C#網(wǎng)絡(luò)協(xié)議UDP

2012-09-24 15:13:50

C#網(wǎng)絡(luò)協(xié)議TCP

2012-09-25 13:47:43

C#網(wǎng)絡(luò)協(xié)議P2P

2012-09-24 14:03:58

C#網(wǎng)絡(luò)協(xié)議C

2012-09-24 14:09:31

C#網(wǎng)絡(luò)協(xié)議C

2024-03-04 18:49:59

反射C#開發(fā)

2009-08-03 16:22:58

C#編程技巧

2009-08-21 14:03:04

C#網(wǎng)絡(luò)編程

2012-09-25 14:06:28

C#網(wǎng)絡(luò)協(xié)議

2012-09-24 14:31:55

C#網(wǎng)絡(luò)協(xié)議C

2012-09-24 14:43:51

C#網(wǎng)絡(luò)協(xié)議C

2012-09-25 15:02:50

C#網(wǎng)絡(luò)協(xié)議

2009-08-21 14:47:39

C#網(wǎng)絡(luò)編程

2009-08-21 17:19:36

C#網(wǎng)絡(luò)編程入門

2009-08-24 09:55:26

C#接口轉(zhuǎn)換

2009-08-24 11:02:52

C#接口映射

2009-08-26 10:34:15

C#類型C#變量

2009-09-01 16:12:41

C#命名指南

2015-09-16 15:11:58

C#異步編程

2009-08-31 18:17:32

C#接口編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號