http://www.wewill.cn/n21170c66.aspxUDP数据传输实例
[日期:2008-06-23]   来源:互联网整理  作者:佚名   [字体:大 中 小]      新闻简介:下面通过一个例子,对UdpClient类的用法及它的一些方法进行说明。在UDP模式下,不存在明显的服务器与客户端之分,所以在这里用A端和B端代替。本例要实现的功能是从A端到B端的点对点通信。打开VS2008,在D:\C#\ch17目录下建立名为P2PTest的Windows应用程序。打开工程,为当前窗体添加如表17-9所示控件。 
        关 键 词:  下面通过一个例子,对UdpClient类的用法及它的一些方法进行说明。在UDP模式下,不存在明显的服务器与客户端之分,所以在这里用A端和B端代替。本例要实现的功能是从A端到B端的点对点通信。打开VS2008,在D:\C#\ch17目录下建立名为P2PTest的Windows应用程序。打开工程,为当前窗体添加如表17-9所示控件。表17-9  添加控件列表控 件 名
 Name
 Text
 
Label
 Label1
 对方IP:
 
TextBox
 tbIP
  
 
TextBox
 tbMsg
  
 
Button
 btnSend
 发送
 
ListBox
 lbInfo
  
 
GroupBox
 gbSend
 发送窗口
 
GroupBox
 gbReceive
 接收窗口
 
Button
 btnClear
 清空
  本例是利用8888端口进行局域网内部的点对点通信,只要确认对方IP,就能相互发送信息。代码的添加主要分为以下步骤。(1)首先是对几个命名空间的引用,包括System.Net、System.Net.Sockets和System.Threading。然后定义如下三个全局变量。private UdpClient uc;private IPEndPoint iep;private Thread th;其中UdpClient是本例的核心成员,主要通过它的相关方法进行数据的收发。(2)本例使用8888端口进行通信,所以应该在当前窗体构造函数Form1()内,用该端口实例化UdpClient。public Form1()        {            InitializeComponent();CheckForIllegalCrossThreadCalls = false;            uc = new UdpClient(8888);        }CheckForIllegalCrossThreadCalls主要是解决线程间的控件操作问题,通过将其属性设置为fasle,可以禁用对操作控件的线程是否为创建该窗体的线程的检测,阻止该异常的发生。这种问题在第16章中也遇到过,当时是采用的委托的方法进行解决。(3)双击“发送”按钮,添加如下代码。iep = new IPEndPoint(IPAddress.Parse(tbIP.Text), 8888);th = new Thread(new ThreadStart(listen));th.IsBackground = true;                                 //设置在后台运行th.Start();                                               //启动线程string temp = tbMsg.Text;byte[] b = Encoding.UTF8.GetBytes(temp);   //对发送的数据的进行UTF8格式的编码   uc.Send(b, b.Length,iep);                              //发送数据其中listen()方法用于监听对方发送过来的消息,实现代码如下。private void listen(){    while (true)    {        string text = Encoding.UTF8.GetString(uc.Receive(ref iep));    //对发送的数据的进行UTF8格式的编码        lbInfo.Items.Add(text + "\n");    }}(4)双击“清空”按钮,添加如下代码。lbInfo.Items.Clear();(5)最后还需要进行一些资源释放的操作。protected override void Dispose(bool disposing){    if (disposing && (components != null))    {        components.Dispose();        th.Abort();                                       //关闭线程        uc.Close();                                       //关闭UdpClient    }    base.Dispose(disposing);}完成以上操作后,将该软件放在两台计算机之间进行测试。