小李程式™的专栏

有勇气来改变可以改变的事情,有度量接受不可改变的事情,有智慧来分辨两者的不同。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Udp 服务器 C#实现代码

Posted on 2005-08-19 15:00  尼斯湖李  阅读(2497)  评论(0编辑  收藏  举报


 
Udp Server C# Code
 
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;
 
 
namespace LirenZhao.Sockets
{
 public class DataReceivedEventArgs:EventArgs
 {
  public DataReceivedEventArgs(byte[] data)
  {
   Data = data;
  }

  byte[] m_Data;
  public byte[] Data
  {
   get{return m_Data;}
   set{m_Data = value;}
  }
 }


 public class ServerStateChangeEventArgs : EventArgs
 {
  public ServerStateChangeEventArgs(bool state)
  {
   Running = state;
  }

  bool m_Running;
  public bool Running
  {
   get{return m_Running;}
   set{m_Running = value;}
  }
 }
 

 public class UdpServer
 {
  #region 构造方法
  public UdpServer():this(8000,1024){}

  public UdpServer(ushort port):this(port,1024)
  {
   _Port = port;
  }

  public UdpServer(ushort port,uint bufferSize)
  {
   _Port = port;
   _bufferSize = bufferSize;
  } 
  #endregion

  #region 属性

  ushort _Port = 8000;
  public ushort Port
  {
   get { return _Port; }
  }
 
  uint _bufferSize = 1024;
  public uint BufferSize
  {
   get{return _bufferSize;}   
  }            
 
  bool m_IsRunning;
  public bool IsRunning
  {
   get{return m_IsRunning;}
  }

  #endregion

  Socket m_UdpServer;
  Thread m_DataReceiveProcThread;

  #region 事件定义
  public delegate void OnReceivedDataHandler(object sender,DataReceivedEventArgs e);
  public event OnReceivedDataHandler OnRecivedData;
        
  public delegate void OnStateChangedHandler(object sender,ServerStateChangeEventArgs e);
  public event OnStateChangedHandler OnStateChanged;
  #endregion
 
  void DataReceiveProc()
  {   
   while(m_IsRunning) 
   {    
    try
    {
     byte[] data = new byte[BufferSize];      
     m_UdpServer.Receive(data);       
            
     if(OnRecivedData != null)
      OnRecivedData(this,new DataReceivedEventArgs(data));     
     System.Threading.Thread.Sleep(100);
    }
    catch(Exception ex)
    {
     m_IsRunning = false;
     if(OnStateChanged != null)
      OnStateChanged(this,new ServerStateChangeEventArgs(false));  
     throw ex;                    
    }
   }
  } 

     public void Stop()
  {
   if(m_IsRunning)
   {
    try
    {     
     m_IsRunning = false;
     if(OnStateChanged != null)
      OnStateChanged(this,new ServerStateChangeEventArgs(m_IsRunning));   

     m_UdpServer.Shutdown(SocketShutdown.Both);
     m_UdpServer.Close();       
     m_DataReceiveProcThread.Abort();
    }
    catch(Exception ex)
    {
     Trace.WriteLine(ex.Message);
    }
   }
  }
 
  public void Start()
  {
   if(!m_IsRunning)
   {
    try
    {
     m_UdpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);                
     IPEndPoint ipep=new IPEndPoint(IPAddress.Any,(int)Port);
     m_UdpServer.Bind(ipep);
    
     //m_IsRunning = ThreadPool.QueueUserWorkItem(new WaitCallback(DataReceiveProc));
  
     m_DataReceiveProcThread = new Thread(new ThreadStart(DataReceiveProc));
     m_DataReceiveProcThread.Start();

     m_IsRunning = true;
     if(OnStateChanged != null)
      OnStateChanged(this,new ServerStateChangeEventArgs(m_IsRunning)); 
    }
    catch(Exception ex)
    {
     throw ex;
    }
   }
  }


  ~UdpServer()
  {
   Stop();
  }
 }
}