大力水手的Blog

大力水手语录

导航

[导入]包装后的UDP通讯组件

 


using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace com.xaccp.Control.UdpControl
{
 /// <summary>
 /// UDP消息到达委托。
 /// 处理方法为void(byte[])。
 /// </summary>
 public delegate void UDPMsgHandler(byte[] receivebytes);
 /// <summary>
 /// 包装后的UDP通讯组件
 /// 作者:周鼎汉
 /// 时间:2007.03.20
 /// </summary>
 public class UDP
 {
  int port;
  /// <summary>
  /// 消息到达事件
  /// </summary>
  public  event UDPMsgHandler MsgArrivedEvent;

  /// <summary>
  /// 目的地端口(从1025开始,默认为10000)
  /// </summary>
  public int Port
  {
   get{return port;}
   set{port =value;}
  }
  /// <summary>
  /// 构造UDP组件对象(无参数)
  /// </summary>
  public UDP()
  {
    this.port=10000;
  }
  /// <summary>
  /// 构造UDP组件对象(有参数)
  /// </summary>
  /// <param name="port">目的地端口(从1025开始,默认为10000)</param>
  public UDP(int port)
  {
   this.port=port;
  }
  /// <summary>
  /// 发送Tcp消息
  /// <code>obj.Send("192.168.0.100",bytes);<br></br></code>
  /// <code>obj.Send("myserver",bytes);<br></br></code>
  /// <code>obj.Send("abc.com",bytes);<br></br></code>
  /// </summary>
  /// <param name="range">发送的目的地,IP地址,或者主机名称。
  /// </param>
  /// <param name="datagram">发送的内容</param>
  public  void Send(string range, byte[] datagram)
  {
   this.Send(range,this.port,datagram);
  }

  /// <summary>
  /// 发送Tcp消息
  /// <code>obj.Send("192.168.0.100",bytes);<br></br></code>
  /// <code>obj.Send("myserver",bytes);<br></br></code>
  /// <code>obj.Send("abc.com",bytes);<br></br></code>
  /// </summary>
  /// <param name="range">发送的目的地,IP地址,或者主机名称。
  /// </param>
  /// <param name="port">目的地端口(从1025开始,默认为10000)
  /// </param>
  /// <param name="datagram">发送的内容</param>
  
  public  void Send(string range,int port, byte[] datagram)
  {
   //建立UdpClient客户端,准备发送,使用无参的构造方法
   UdpClient sender = new UdpClient();
   //建立发送目的地的IPEndPoint
   string ipaddress=Dns.GetHostByName(range).AddressList.GetValue(0).ToString();
   IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ipaddress),port);
   try
   {
    //发送数据到目的地IPEndPoint
    sender.Send(datagram,datagram.Length,endPoint);
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
    return;
   }
   finally
   {
    sender.Close();
   }
  }

  /// <summary>
  /// 接收数据的方法,一般在线程中执行。
  /// <code>
  /// UDP udp=new UDP();
  /// Thread t=new Thread(new ThreadStart(udp.Receiver));
  /// t.IsBackground=true;
  /// t.Start();
  /// </code>
  /// </summary>
  public  void Receiver()
  {
   //准备接收的UdpClient,在固定的端口监听(port)
   UdpClient receiveUdpClient = new UdpClient(port);
   //从远程主机那里接收数据,未接收以前是不知道的。
   IPEndPoint RemoteIPEndPoint = null;
   try
   {
    //持续不断的接收
    while (true)
    {
     //接收数据,如果没有数据过了,则此方法阻塞。
     byte[] receiveBytes = receiveUdpClient.Receive(ref RemoteIPEndPoint);
     //一旦接收到了数据,那么调用激活事件的方法激活数据到达事件
     if(MsgArrivedEvent!=null)
     {
      MsgArrivedEvent(receiveBytes);
     }
    }
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
    return;
   }
  }
 }
}


文章来源:http://blog.sina.com.cn/s/blog_49458c27010008nx.html

posted on 2008-05-01 09:07  jack.zhou  阅读(212)  评论(0编辑  收藏  举报