您的位置:首页 > 编程语言 > C#

Udp 服务器 C#实现代码

2010-02-08 09:25 288 查看
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: