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();
}
}
}
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();
}
}
}
相关文章推荐
- C#的Socket实现UDP协议通信示例代码
- C#网络编程系列文章(七)之UdpClient实现异步UDP服务器
- C#实现把图片下载到服务器代码
- 基于C#的UDP协议的同步通信实现代码
- 最近要用C#实现用免费smtp服务器(GMail)发邮件,贴段整理好的代码
- C#网络编程系列文章(八)之UdpClient实现同步UDP服务器
- C#实现UDP打洞 原理及代码(四)
- C#实现把图片下载到服务器代码
- VB.NET C#实现基于UDP的免服务器局域网多客户端点对点通讯
- C#网络编程系列文章(五)之Socket实现异步UDP服务器
- C#网络编程系列文章(六)之Socket实现同步UDP服务器
- C#网络编程系列文章(八)之UdpClient实现同步UDP服务器
- C#实现UDP打洞 原理及代码(三)
- c# socket编程udp客户端实现代码分享
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- C#实现用免费smtp服务器(GMail)发邮件,贴段整理好的代码
- C#实现UDP打洞 原理及代码(二)
- 用C#实现用免费smtp服务器(GMail)发邮件,贴段整理好的代码
- C#网络编程系列文章(五)之Socket实现异步UDP服务器
- C#实现UDP打洞 原理及代码(一)