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