博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络UDP通讯类库
阅读量:4356 次
发布时间:2019-06-07

本文共 13951 字,大约阅读时间需要 46 分钟。

View Code
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);    ///      /// ----名称:UDP通讯类     /// ----建立:niefei     /// ----建立时间:2004-12-6     ///      /// 
/// ----使用说明与定义: /// ----接到字符串 "NeedDownCards" 表示需要调用卡下载功能 ///
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; /// /// 为了不让定义的事件在没有附加接收函数时出错,需要先加载一个空函数 /// /// protected void EmptyFunction(string Msg) { } protected ArrayList m_computers; /// /// 发送命令文本常量 /// protected string m_sendText; /// /// 默认发送的字符串 /// protected const string m_sendStr = "Hello!Server Is Running!"; /// /// Udp对象 /// protected UdpClient m_Client; /// /// 本地通讯端口(默认8888) /// protected int m_LocalPort; /// /// 本一IP(默认127.0.0.1) /// protected string m_LocalIP; /// /// 对方IP /// protected string m_SendToIP ="192.168.0.255"; /// /// 远程通讯端口(默认8000) /// protected int m_RemotePort=9999; /// /// 当有多台客户机需要与服务器通讯时,这里记录了所有客户机的信息 /// protected List
m_ClientList = new List
(); ///
/// 跟踪是否退出程序 /// protected bool m_Done; ///
/// 设置是否要发送 /// protected bool m_flag; #endregion #region 属性区 ///
/// 定义委托 /// public delegate void SOCKETDelegateArrive(string sReceived); ///
/// 定义一个消息接收事件 /// public SOCKETDelegateArrive SOCKETEventArrive; ///
/// 定义一个接受线程 /// public Thread recvThread; ///
/// 定义一个检测发送线程 /// public Thread checkSendThread; ///
/// 下载标志 /// public bool flag { set { this.m_flag = value; } get { return this.m_flag; } } ///
/// 设置通讯端口 /// public int LocalPort { set { m_LocalPort = value; } get { return m_LocalPort; } } ///
/// 设置本地IP /// public string LocalIP { set { m_LocalIP = value; } get{
return m_LocalIP;} } ///
/// 设置对方IP地址 ,m_SendToIP /// public string RemoteIP { set { m_SendToIP = value; m_SendToIpEndPoint = new IPEndPoint(IPAddress.Parse(this.m_SendToIP), m_RemotePort); } get { return m_SendToIP; } } ///
/// 远程通讯端口 /// public int RemotePort { set { m_RemotePort = value; m_SendToIpEndPoint = new IPEndPoint(IPAddress.Parse(this.m_SendToIP), m_RemotePort); } get { return m_RemotePort; } } ///
/// 设置多个远程接收端 /// public List
ClientList { get { return m_ClientList; } set { m_ClientList = value; } } ///
/// 设置要发送的岗位对象 /// public ArrayList computers { set { this.m_computers = value; } get { return this.m_computers; } } ///
/// 收发开关,false为正常工作,true为关闭收发 /// public bool Done { set { m_Done = value; } get { return m_Done; } } #endregion ///
/// 构造函数设置各项默认值 /// public UDPSocket() { m_sendText = string.Empty; m_computers = new ArrayList(); m_Done = false; m_flag = false; } ///
/// 初始化 /// 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"); } } ///
/// 析构函数 /// ~UDPSocket() { Dispose(); } ///
/// 关闭对象 /// public void Dispose() { DisConnection(); m_computers = null; } ///
/// 关闭UDP对象 /// 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; ///
/// 侦听线程 /// 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); } } ///
/// 循环接收,收到数据引发BufferNotifyEventHandler事件 /// 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
CaptureDataQueue = new Queue
(); ///
/// 用于接收音频数据的入口 /// ///
public int ReceiveSound(byte[] CaptureData) { if (!m_Done) { CaptureDataQueue.Enqueue(CaptureData); } return CaptureData.Length; } ///
/// 启动检测发送侦听线程 /// 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!"); } } ///
/// 如果当前发送队列中有数据,就启动发送 /// 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 二进制发送区 ///
/// 发送字节流数据 /// ///
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; ///
/// 向服务器发送脉冲信号 /// 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 }}

 

转载于:https://www.cnblogs.com/superstar/archive/2012/06/22/2558831.html

你可能感兴趣的文章
第二周 1 时间换算(5分)
查看>>
定义label标签宽度需要设置display:inline-block;
查看>>
OUC_Summer Training_ DIV2_#2之解题策略 715
查看>>
Centos6.8搭建Git服务(git版本可选)(转)
查看>>
转载:Linux下用mutt给QQ邮箱发匿名邮件
查看>>
[模版]平衡树splay2
查看>>
sed匹配多行并替换其中的内容
查看>>
android中数据库的介绍及实例
查看>>
Windows Phone 8 锁屏背景与通知
查看>>
制作 alipay-sdk-java包到本地仓库
查看>>
CODEVS——T 2956 排队问题
查看>>
BZOJ 1797 最小割(最小割割边唯一性判定)
查看>>
BZOJ 1818 内部白点(离散化+树状数组)
查看>>
Math对象及相关方法
查看>>
Nginx负载均衡(架构之路)
查看>>
C#线程同步控制
查看>>
绝对路径与相对路径全解析
查看>>
百度熊掌号历史数据提交
查看>>
GIS算法基础(九)矢量压缩算法-道格拉斯普克算法
查看>>
saltstack 基本的批量操作
查看>>