根据前面所讲的网络编程的基础知识,以及UDP网络编程的特点,下面创建一个广播数据报程序。广播数据报是一种较新的技术,类似于电台广播,广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定的波段、频率才可以收听广播内容。
本实例要求主机不断地重复播出节目预报,这样可以保证加入到同一组的主机随时接收到广播信息。接收者将正在接收的信息放在一个文本框中,并将接收的全部信息放在另一个文本框中。
(1)创建广播主机项目Server(控制台应用程序),在Main方法中创建UDP连接;然后通过UDP连接不断向外发送广播信息。代码如下:
01 namespace Server
02 {
03 class Program
04 {
05 static UdpClientudp = new UdpClient();//创建UdpClient对象
06 static void Main(string[] args)
07 {
08 //调用UdpClient对象的Connect方法建立默认远程主机
09 udp.Connect("127.0.0.1", 888);
10 while (true)
11 {
12 Thread thread = new Thread(() =>
13 {
14 while (true)
15 {
16 try
17 {
18
19 //定义一个字节数组,用来存放发送到远程主机的信息
20 Byte[] sendBytes = Encoding.Default.GetBytes("(" + DateTime.Now.ToLongTimeString() + ")节目预报:八点有大型晚会,请收听");
21 Console.WriteLine("(" + DateTime.Now.ToLongTimeString() + ")节目预报:八点有大型晚会,请收听");
22 //调用UdpClient对象的Send方法将UDP数据报发送到远程主机
23 udp.Send(sendBytes, sendBytes.Length);
24 Thread.Sleep(2000); //线程休眠2秒
25 }
26 catch (Exception ex)
27 {
28 Console.WriteLine(ex.Message);
29 }
30 }
31 });
32 thread.Start(); //启动线程
33 }
34 }
35 }
36 }
说明:上面代码实现时用到了Thread类,该类表示线程类,其详细使用请参见本书第15章。程序运行结果如图14.15所示。
图14.15 广播主机程序的运行结果
(2)创建接收广播项目Client(Windows窗体应用程序),在默认窗体中添加两个Button控件和两个TextBox控件,并且将两个TextBox控件设置为多行文本框。单击“开始接收”按钮,系统开始接收主机播出的信息;单击“停止接收”按钮,系统会停止接收广播主机播出的信息。代码如下:
01 namespace Client
02 {
03 public partial class Form1 : Form
04 {
05 public Form1()
06 {
07 InitializeComponent();
08 CheckForIllegalCrossThreadCalls = false; //在其他线程中可以调用主窗体控件
09 }
10 bool flag = true; //标识是否接收数据
11 UdpClientudp; //创建UdpClient对象
12 Thread thread; //创建线程对象
13 private void button1_Click(object sender, EventArgs e)
14 {
15 udp = new UdpClient(888); //使用端口号创建UDP连接对象
16 flag = true; //标识接收数据
17 //创建IPEndPoint对象,用来显示响应主机的标识
18 IPEndPointipendpoint = new IPEndPoint(IPAddress.Any, 888);
19 thread = new Thread(() => //新开线程,执行接收数据操作
20 {
21 while(flag) //如果标识为true
22 {
23 try
24 {
25 if (udp.Available<= 0) continue; //判断是否有网络数据
26 if (udp.Client == null) return; //判断连接是否为空
27 //调用UdpClient对象的Receive方法获得从远程主机返回的UDP数据报
28 byte[] bytes = udp.Receive(ref ipendpoint);
29 //将获得的UDP数据报转换为字符串形式
30 string str = Encoding.Default.GetString(bytes);
31 textBox2.Text = "正在接收的信息:\n" + str; //显示正在接收的数据
32 textBox1.Text += "\n" + str; //显示接收的所有数据
33 }
34 catch (Exception ex)
35 {
36 MessageBox.Show(ex.Message); //错误提示
37 }
38 Thread.Sleep(2000); //线程休眠2秒
39 }
40 });
41 thread.Start();//启动线程
42 }
44 private void button2_Click(object sender, EventArgs e)
45 {
46 flag = false; //标识不接收数据
47 if (thread.ThreadState == ThreadState.Running) //判断线程是否运行
48 thread.Abort();//终止线程
49 udp.Close();//关闭连接
50 }
51 }
52 }
程序运行结果如图14.16所示。
图14.16 接收广播程序的运行结果
原文地址:http://blog.51cto.com/13423192/2061413
时间: 2024-11-04 14:41:53