using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
using System;
using System.Collections.Generic;
namespace SocketLibrary
{
public delegate void BufferNotifyEventHandler(byte[] CaptureData,EndPoint FromIP);
/// <summary>
/// ----名称:UDP通讯类
/// ----建立:niefei
/// ----建立时间:2004-12-6
/// </summary>
/// <remarks>
/// ----使用说明与定义:
/// ----接到字符串 "NeedDownCards" 表示需要调用卡下载功能
/// </remarks>
public class UDPSocket
{
public class ClientEndPoint
{
public ClientEndPoint() { }
public ClientEndPoint(int cID, string remoteIP, int remotePort)
{
CID = cID;
RemoteIP = remoteIP;
RemotePort = remotePort;
}
public int CID;
public string RemoteIP = "192.168.0.255";
public int RemotePort = 9999;
}
public UDPPackage.UdpData PulseData;
#region 内部变量区
private IPEndPoint m_SendToIpEndPoint = null;
/// <summary>
/// 为了不让定义的事件在没有附加接收函数时出错,需要先加载一个空函数
/// </summary>
/// <param name="Msg"></param>
protected void EmptyFunction(string Msg) { }
protected ArrayList m_computers;
/// <summary>
/// 发送命令文本常量
/// </summary>
protected string m_sendText;
/// <summary>
/// 默认发送的字符串
/// </summary>
protected const string m_sendStr = "Hello!Server Is Running!";
/// <summary>
/// Udp对象
/// </summary>
protected UdpClient m_Client;
/// <summary>
/// 本地通讯端口(默认8888)
/// </summary>
protected int m_LocalPort;
/// <summary>
/// 本一IP(默认127.0.0.1)
/// </summary>
protected string m_LocalIP;
/// <summary>
/// 对方IP
/// </summary>
protected string m_SendToIP ="192.168.0.255";
/// <summary>
/// 远程通讯端口(默认8000)
/// </summary>
protected int m_RemotePort=9999;
/// <summary>
/// 当有多台客户机需要与服务器通讯时,这里记录了所有客户机的信息
/// </summary>
protected List<ClientEndPoint> m_ClientList = new List<ClientEndPoint>();
/// <summary>
/// 跟踪是否退出程序
/// </summary>
protected bool m_Done;
/// <summary>
/// 设置是否要发送
/// </summary>
protected bool m_flag;
#endregion
#region 属性区
/// <summary>
/// 定义委托
/// </summary>
public delegate void SOCKETDelegateArrive(string sReceived);
/// <summary>
/// 定义一个消息接收事件
/// </summary>
public SOCKETDelegateArrive SOCKETEventArrive;
/// <summary>
/// 定义一个接受线程
/// </summary>
public Thread recvThread;
/// <summary>
/// 定义一个检测发送线程
/// </summary>
public Thread checkSendThread;
/// <summary>
/// 下载标志
/// </summary>
public bool flag
{
set { this.m_flag = value; }
get { return this.m_flag; }
}
/// <summary>
/// 设置通讯端口
/// </summary>
public int LocalPort
{
set { m_LocalPort = value; }
get { return m_LocalPort; }
}
/// <summary>
/// 设置本地IP
/// </summary>
public string LocalIP
{
set { m_LocalIP = value; }
get{return m_LocalIP;}
}
/// <summary>
/// 设置对方IP地址 ,m_SendToIP
/// </summary>
public string RemoteIP
{
set
{
m_SendToIP = value;
m_SendToIpEndPoint =
new IPEndPoint(IPAddress.Parse(this.m_SendToIP), m_RemotePort);
}
get { return m_SendToIP; }
}
/// <summary>
/// 远程通讯端口
/// </summary>
public int RemotePort
{
set
{
m_RemotePort = value;
m_SendToIpEndPoint =
new IPEndPoint(IPAddress.Parse(this.m_SendToIP), m_RemotePort);
}
get { return m_RemotePort; }
}
/// <summary>
/// 设置多个远程接收端
/// </summary>
public List<ClientEndPoint> ClientList
{
get { return m_ClientList; }
set { m_ClientList = value; }
}
/// <summary>
/// 设置要发送的岗位对象
/// </summary>
public ArrayList computers
{
set { this.m_computers = value; }
get { return this.m_computers; }
}
/// <summary>
/// 收发开关,false为正常工作,true为关闭收发
/// </summary>
public bool Done
{
set { m_Done = value; }
get { return m_Done; }
}
#endregion
/// <summary>
/// 构造函数设置各项默认值
/// </summary>
public UDPSocket()
{
m_sendText = string.Empty;
m_computers = new ArrayList();
m_Done = false;
m_flag = false;
}
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
//初始化UDP对象
try
{
//Dispose();
//SOCKETEventArrive += this.EmptyFunction;
if (m_LocalIP != null && m_LocalIP != "")
{
m_Client = new UdpClient(new IPEndPoint(IPAddress.Parse(m_LocalIP), m_LocalPort)); ;
}
else
{
m_Client = new UdpClient(m_LocalPort);
}
//m_Client = new UdpClient(m_LocalPort);
//SOCKETEventArrive("Initialize succeed by " + m_LocalPort.ToString() + " port");
}
catch
{
//SOCKETEventArrive("Initialize failed by " + m_LocalPort.ToString() + " port");
}
}
/// <summary>
/// 析构函数
/// </summary>
~UDPSocket() { Dispose(); }
/// <summary>
/// 关闭对象
/// </summary>
public void Dispose()
{
DisConnection();
m_computers = null;
}
/// <summary>
/// 关闭UDP对象
/// </summary>
public void DisConnection()
{
try
{
if (m_Client != null)
{
this.Done = true;
if (recvThread != null)
{
this.recvThread.Abort();
}
if (checkSendThread != null)
{
this.checkSendThread.Abort();
}
if (recvThread != null)
{
this.recvThread.Abort();
}
if (checkSendThread != null)
{
this.checkSendThread.Abort();
}
m_Client.Close();
m_Client = null;
}
}
catch
{
this.Done = true;
m_Client.Close();
m_Client = null;
}
finally
{
this.Done = true;
if (m_Client != null)
{
m_Client.Close();
m_Client = null;
}
}
}
#region 接收区
public event BufferNotifyEventHandler BufferNotify;
/// <summary>
/// 侦听线程
/// </summary>
public void StartRecvThreadListener()
{
try
{
// 启动等待连接的线程
recvThread = new Thread(new ThreadStart(Received));
recvThread.Priority = ThreadPriority.Normal;
recvThread.IsBackground = false;
recvThread.Start();
//SOCKETEventArrive("[Received]Thread Start....");
}
catch(Exception exp)
{
//SOCKETEventArrive("[Received]Thread Start failed!"+exp.Message);
}
}
/// <summary>
/// 循环接收,收到数据引发BufferNotifyEventHandler事件
/// </summary>
private void Received()
{
while (!m_Done)
{
//接收数据
try
{
IPEndPoint endpoint = null;
if (m_Client != null && recvThread.IsAlive)
{
m_Client.Client.Blocking = true;
Byte[] CaptureData = m_Client.Receive(ref endpoint);
BufferNotify(CaptureData, m_Client.Client.LocalEndPoint);
}
else if (!recvThread.IsAlive)
{
recvThread.Resume();
}
if (this.checkSendThread != null) //顺便检查发送线程是否工作正常
{
if (this.checkSendThread.ThreadState == ThreadState.Aborted
|| this.checkSendThread.ThreadState == ThreadState.Stopped)
{
checkSendThread.Abort();
checkSendThread = null;
checkSendThread = new Thread(new ThreadStart(ChekSendListener));
checkSendThread.IsBackground = false;
checkSendThread.Start();
}
}
}
catch (Exception exp)
{
//SOCKETEventArrive("ReceiveData:CaptureData. Nullerror"+exp.Message);
}
finally { }
Thread.Sleep(10); //防止系统资源耗尽
}
}
#endregion
#region 发送区
public Queue<byte[]> CaptureDataQueue = new Queue<byte[]>();
/// <summary>
/// 用于接收音频数据的入口
/// </summary>
/// <param name="CaptureData"></param>
public int ReceiveSound(byte[] CaptureData)
{
if (!m_Done)
{
CaptureDataQueue.Enqueue(CaptureData);
}
return CaptureData.Length;
}
/// <summary>
/// 启动检测发送侦听线程
/// </summary>
public void StartCheckSendListenerThread()
{
try
{
checkSendThread = new Thread(new ThreadStart(ChekSendListener));
checkSendThread.Priority = ThreadPriority.Normal;
checkSendThread.IsBackground = false;
checkSendThread.Start();
//SOCKETEventArrive("[ChekSendListener]Thread Start...");
}
catch
{
//SOCKETEventArrive("[ChekSendListener]Thread Start failed!");
}
}
/// <summary>
/// 如果当前发送队列中有数据,就启动发送
/// </summary>
private void ChekSendListener()
{
CaptureDataQueue.Clear();
while (!m_Done)
{
try
{
if (CaptureDataQueue.Count > 0)
{
this.sendData(CaptureDataQueue.Dequeue());
}
if (this.recvThread != null)
{
if (this.recvThread.ThreadState == ThreadState.Aborted
|| this.recvThread.ThreadState == ThreadState.Stopped)
{
recvThread.Abort();
recvThread = null;
recvThread = new Thread(new ThreadStart(Received));
recvThread.IsBackground = false;
recvThread.Start();
}
}
}
catch { }
finally { }
Thread.Sleep(1); //防止系统资源耗尽
}
}
#region 二进制发送区
/// <summary>
/// 发送字节流数据
/// </summary>
/// <param name="CaptureData"></param>
public void sendData(byte[] CaptureData/*UDPPackage.UDPData UdpData*/)
{
try
{
if (m_Client == null)
{
m_Client = new UdpClient(new IPEndPoint(IPAddress.Parse(m_LocalIP), m_LocalPort));
}
//m_Client.Connect(this.m_SendToIP, m_RemotePort);
//byte[] bytReceivedData = UdpData.ToByte();// new byte[CaptureData.Length];
//System.Buffer.BlockCopy(CaptureData, 0, bytReceivedData, 0, CaptureData.Length);
// 连接后传送一个消息给ip主机
//m_Client.Send(bytReceivedData, bytReceivedData.Length);
if (0 != this.m_ClientList.Count)
{
for (int i = 0; i < this.m_ClientList.Count; i++)
{
int m = m_Client.Send(CaptureData, CaptureData.Length,
new IPEndPoint(IPAddress.Parse(this.m_ClientList[i].RemoteIP), this.m_ClientList[i].RemotePort));
}
}
else
{
int i = m_Client.Send(CaptureData, CaptureData.Length, m_SendToIpEndPoint);
}
}
catch
{
}
finally
{
//m_Client.Close();
//m_Client = null;
}
}
#endregion
#endregion
#region 周期信号区
Thread PualseThread;
/// <summary>
/// 向服务器发送脉冲信号
/// </summary>
public void sendPulseSignal()
{
try
{
PualseThread = new Thread(new ThreadStart(PulseSingnal));
PualseThread.Priority = ThreadPriority.Normal;
PualseThread.Start();
//SOCKETEventArrive("[PulseSignal]Thread Start...");
}
catch
{
//SOCKETEventArrive("[PulseSignal]Thread Start failed!");
}
}
private void PulseSingnal()
{
while (true)
{
if (this.PulseData.EXP == 1)
{
this.sendData(UDPPackage.StructToBytes(this.PulseData));
}
Thread.Sleep(5000); //每五秒钟一次脉冲
}
}
#endregion
}
}