1、 public partial class FormChat : Form delegate void AddListBoxItemCallback(string text); AddListBoxItemCallback listBoxCallback; /使用的接收端口号 private int port = 8001; private UdpClient udpClient; public FormChat() InitializeComponent(); /初始化 listBoxCallback = new AddListBoxItemCallback(AddListBoxItem);
2、 private void AddListBoxItem(string text) /如果listBoxReceive被不同的线程访问则通过委托处理; if (listBoxReceive.InvokeRequired)/ C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。 this.Invoke(listBoxCallback, text); else listBoxReceive.Items.Add(text); listBoxReceive.SelectedInd
3、ex = listBoxReceive.Items.Count - 1; / / 在后台运行的接收线程/summary private void ReceiveData() /在本机指定的端口接收 udpClient = new UdpClient(port); IPEndPoint remote = null; /接收从远程主机发送过来的信息; while (true) try /关闭udpClient时此句会产生异常 byte bytes = udpClient.Receive(ref remote); string str = Encoding.UTF8.GetString(bytes,
4、 0, bytes.Length); AddListBoxItem(string.Format(来自0:1, remote, str); catch /退出循环,结束线程 break; / 发送数据到远程主机 private void sendData() UdpClient myUdpClient = new UdpClient(); IPAddress remoteIP; if (IPAddress.TryParse(textBoxRemoteIP.Text, out remoteIP) = false)/如果字符串包含非数值字符或者所包含的数值对于指定的特定类型而言太大或太小,TryPa
5、rse都将返回 false 并将 out 参数设置为零。否则,它将返回 true,并且将 out 参数设置为字符串的数值 MessageBox.Show(远程IP格式不正确); return; IPEndPoint iep = new IPEndPoint(remoteIP, port); byte bytes = System.Text.Encoding.UTF8.GetBytes(textBoxSend.Text); myUdpClient.Send(bytes, bytes.Length, iep); textBoxSend.Clear(); myUdpClient.Close(); t
6、extBoxSend.Focus(); catch (Exception err) MessageBox.Show(err.Message, 发送失败 finally private void FormChat_Load(object sender, EventArgs e) /设置listBox样式 listBoxReceive.HorizontalScrollbar = true; listBoxReceive.Dock = DockStyle.Fill; /扩展填满单元格 /获取本机第一个可用IP地址 IPAddress myIP = (IPAddress)Dns.GetHostAddr
7、esses(Dns.GetHostName().GetValue(0); /为了在同一台机器调试,此IP也作为默认远程IP textBoxRemoteIP.Text = myIP.ToString(); /创建一个线程接收远程主机发来的信息 Thread myThread = new Thread(new ThreadStart(ReceiveData); /将线程设为后台运行 myThread.IsBackground = true; myThread.Start(); / 单击发送按钮触发的事件 private void buttonSend_Click(object sender, Ev
8、entArgs e) sendData(); / 在textBoxSend中按下并释放Enter键后触发的事件 private void textBoxData_KeyPress(object sender, KeyPressEventArgs e) if (e.KeyChar = (char)Keys.Enter) private void FormChat_FormClosing(object sender, FormClosingEventArgs e) udpClient.Close(); (3) 按键编译并执行,向默认远程主机发送一些信息,运行效果如图2所示。【例2】编写一个Wind
9、ows应用程序,向子网发送广播信息,同时接收子网中的任意主机发送的广播信息。 (1) 创建一个名为BroadcastExample的Windows应用程序,修改Form1.cs为FormBroadcast.cs,设计界面如图3所示。namespace BroadcastExample public partial class FormBroacast : delegate void AppendStringCallback(string text); AppendStringCallback appendStringCallback; public FormBroacast() appendS
10、tringCallback = new AppendStringCallback(AppendString); private void AppendString(string text) if (richTextBox1.InvokeRequired = true) this.Invoke(appendStringCallback, text); richTextBox1.AppendText(text + rn AppendString(string.Format( /让其自动提供子网中的IP广播地址 IPEndPoint iep = new IPEndPoint(IPAddress.Br
11、oadcast, 8001); /允许发送和接收广播数据报 myUdpClient.EnableBroadcast = true; /将发送内容转换为字节数组 byte bytes = System.Text.Encoding.UTF8.GetBytes(textBox1.Text); /向子网发送信息 textBox1.Clear(); textBox1.Focus(); private void FormBroacast_Load(object sender, EventArgs e) private void FormBroacast_FormClosing(object sender,
12、 FormClosingEventArgs e)(3) 按键编译并执行,发送一些信息,观察结果。【例3】编写一个Windows应用程序,利用组播技术向子网发送组播信息,同时接收组播的信息。 (1) 创建一个名为MulticastExample的Windows应用程序,修改Form1.cs为FormMulticast.cs,设计界面如图4所示。namespace MulticastExample public partial class FormMulticast : public FormMulticast() /必须使用组播地址范围内的地址 udpClient.JoinMulticastGr
13、oup(IPAddress.Parse(224.0.0.1); udpClient.Ttl = 50; IPEndPoint iep = new IPEndPoint(IPAddress.Parse(), 8001); private void FormMulticast_Load(object sender, EventArgs e) private void FormMulticast_FormClosing(object sender, FormClosingEventArgs e)【例4】编写一个Windows应用程序,利用组播技术进行网络会议讨论。 (1) 创建一个名为“NetMee
14、tingExample”的Windows应用程序,修改Form1.cs为FormMeeting.cs,设计界面如图5所示。namespace NetMeetingExample public partial class FormMeeting : private enum ListBoxOperation AddItem, RemoveItem ; private delegate void SetListBoxItemCallback( ListBox listbox, string text, ListBoxOperation operation); SetListBoxItemCallb
15、ack listBoxCallback; /使用的IP地址 private IPAddress ip = IPAddress.Parse(224.100.0.1 public FormMeeting() listBoxCallback = new SetListBoxItemCallback(SetListBoxItem); private void SetListBoxItem(ListBox listbox, string text, ListBoxOperation operation) if (listbox.InvokeRequired = true) this.Invoke(lis
16、tBoxCallback, listbox, text, operation); if (operation = ListBoxOperation.AddItem) if (listbox = listBoxAddress) if (listbox.Items.Contains(text) = false) listbox.Items.Add(text); listbox.SelectedIndex = listbox.Items.Count - 1; listbox.ClearSelected(); else if (operation = ListBoxOperation.RemoveItem) listbox.Items.Remove(text); private void SendToAll(string sendString) IPEndPoint iep = new IPEndPoint(ip, port); byte bytes = System.Text.Encoding.UTF8.GetBytes(sendString);
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2