《WinForm开发系列之高级篇》Item3 UDP异步传输

UDPSocket.cs

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AysTcp
{
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; }
}
}
}

 

UDP_Client.cs

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace AysTcp
{
public class UDP_Client
{
#region 属性
private IPAddress _ClientAddress = IPAddress.Any;
private int _ClientPort = 0;
private byte[] _data = new byte[] { };
public IPEndPoint Client
{

get { return new IPEndPoint(_ClientAddress, _ClientPort); }
set
{
_ClientAddress
= value.Address;
_ClientPort
= value.Port;
}

}

public IPAddress ClientAddress
{

get
{
return _ClientAddress;

}
set
{
_ClientAddress
= value;

}

}


public int ClientPort
{

get { return _ClientPort; }
set { _ClientPort = value; }

}

#endregion

#region 方法
public void SendMessage(byte[] message)
{
//' Encode message per settings

// ' Send the message
_data = message;
try
{
SendUDPMessage(_data);
}
catch (Exception ex)
{
throw ex; }


}

private int SendUDPMessage(Byte[] _data)
{
//' Create a UDP Server and send the message, then clean up
UdpClient _UDPServer = null;
int ReturnCode;
try
{
_UDPServer
= new UdpClient();
ReturnCode
= 0;
_UDPServer.Connect(Client);
ReturnCode
= _UDPServer.Send(_data, _data.Length);
}
catch (Exception ex)
{
throw ex; }
finally
{
if (_UDPServer != null)
{
_UDPServer.Close();
}
}
return ReturnCode;
}



#endregion

}

}

UDP_Server.cs

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Diagnostics;

namespace AysTcp
{
public class UDP_Server
{
private Thread _ThreadReceive;
private int _ClientPort = 0;
private string _Message = null;

private UdpClient _UDPClient;
private IPEndPoint _Server = new IPEndPoint(IPAddress.Any, 0);
private int _BytesReceived = 0;

#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
#region 属性

int _bufferSize = 1024;
public int BufferSize
{
get { return _bufferSize; }
set { _bufferSize = value; }
}
public int BytesReceived
{
get { return _BytesReceived; }

}
public string Message
{
get { return _Message; }
}

public int ClientPort
{
get { return _ClientPort; }
set { _ClientPort = value; }
}

#endregion
#region 方法
void DataReceiveProc()
{
//BeforeReceive(this,new EventArgs());
_Message = "";
byte[] data = new byte[BufferSize];
try
{


data
= _UDPClient.Receive(ref _Server);

if (OnRecivedData != null)
OnRecivedData(
this, new DataReceivedEventArgs(data));
System.Threading.Thread.Sleep(
100);
}
catch (Exception ex)
{

if (OnStateChanged != null)
OnStateChanged(
this, new ServerStateChangeEventArgs(false));
throw ex;
}
finally {

InitializeThread();


}


}
private void InitializeClient()
{
if (_UDPClient == null)
{
this._UDPClient = new UdpClient(ClientPort);
}


}
private void InitializeThread()
{
try
{
_ThreadReceive
= new Thread(new ThreadStart(DataReceiveProc));
_ThreadReceive.Start();
}
catch(Exception ex) {

throw ex;
}
}
public void Start()
{
InitializeClient();
InitializeThread();
}
#endregion
public void Stop()
{

try
{


_ThreadReceive.Abort();
if (_UDPClient != null)
{
// ' Close the UDPClient and then force it to Nothing

_UDPClient.Close();
_UDPClient
= null;
}
}
catch (Exception ex)
{
throw ex;

}

}
#region 析构方法
~UDP_Server()
{
Stop();
}
#endregion
}
}

 

posted @ 2010-02-26 15:06  Sue_娜  阅读(432)  评论(1编辑  收藏  举报