C# WiFi多线程收发报文

分享:C# tcp通讯 收发报文 首先我们先来了解一下tcp通讯吧,我们都知道tcp通讯的过程会经过三次握手,四次挥手,这次我们不详细来讲解这些,我们来看看实际使用接收和发送数据是怎么操作吧,先看以下的代码: 1、使用networkstream接收tcp报文 public void startAccept() { try { ... 阅读详情

网络通信

public class NetClient
    {
        /// <summary>
        /// 接收数据缓冲区大小64K
        /// </summary>
        public const int DefaultBufferSize = 64 * 1024;

        public event EventHandler<EventArgCollection.ConnectionEventArgs> OnConnectionChanged;

        public event EventHandler<EventArgCollection.SocketEventArgs> OnSocketEventRaised;

        public event EventHandler<EventArgCollection.SocketErrorEventArgs> OnSocketErrorRaised;

        #region 字段

        /// <summary>
        /// 客户端与服务器之间的会话类
        /// </summary>
        private Session _session;

        /// <summary>
        /// 客户端是否已经连接服务器
        /// </summary>
        private bool _isConnected = false;

        /// <summary>
        /// 报文解析器
        /// </summary>
        private DatagramResolver _resolver;

        /// <summary>
        /// 通讯格式编码解码器
        /// </summary>
        private Coder _coder;

        /// <summary>
        /// 接收数据缓冲区
        /// </summary>
        private byte[] _recvDataBuffer = new byte[DefaultBufferSize];

        #endregion

        #region 事件定义

        /// <summary>
        /// 已经连接服务器事件
        /// </summary>
        public event NetEvent ConnectedServer;

        /// <summary>
        /// 接收到数据报文事件
        /// </summary>
        public event NetEvent ReceivedDatagram;

        /// <summary>
        /// 连接断开事件
        /// </summary>
        public event NetEvent DisConnectedServer;

        #endregion

        #region 属性

        /// <summary>
        /// 返回客户端与服务器之间的会话对象
        /// </summary>
        public Session ClientSession
        {
            get
            {
                return _session;
            }
        }

        /// <summary>
        /// 返回客户端与服务器之间的连接状态
        /// </summary>
        public bool IsConnected
        {
            get
            {
                return _isConnected;
            }
        }

        /// <summary>
        /// 数据报文分析器
        /// </summary>
        public DatagramResolver Resovlver
        {
            get
            {
                return _resolver;
            }
            set
            {
                _resolver = value;
            }
        }

        /// <summary>
        /// 编码解码器
        /// </summary>
        public Coder ServerCoder
        {
            get
            {
                return _coder;
            }
        }

        #endregion

        #region 公有方法

        /// <summary>
        /// 默认构造函数,使用默认的编码格式
        /// </summary>
        public NetClient()
        {
            _coder = new Coder(Coder.EncodingMothord.Default);
        }

        /// <summary>
        /// 构造函数,使用一个特定的编码器来初始化
        /// </summary>
        /// <param name="_coder">报文编码器</param>
        public NetClient(Coder coder)
        {
            _coder = coder;
        }

        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="ip">服务器IP地址</param>
        /// <param name="port">服务器端口</param>
        public virtual void Connect(string ip, int port)
        {
            /*
            if (IsConnected)
            {
                Debug.Assert(_session != null);
                Close();
            }
            */

            Socket newClientSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

            try
            {

                IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
                newClientSocket.BeginConnect(iep, new AsyncCallback(Connected), newClientSocket);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public virtual void Disconnect()
        {

        }


        /// <summary>
        /// 发送数据报文
        /// </summary>
        /// <param name="datagram"></param>
        public virtual void Send(string datagram)
        {
            if (datagram.Length == 0)
            {
                return;
            }

            if (!_isConnected)
            {
                throw (new ApplicationException("没有连接服务器,不能发送数据"));
            }

            //获得报文的编码字节
            byte[] data = _coder.GetEncodingBytes(datagram);

            _session.ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None,
             new AsyncCallback(SendDataEnd), _session.ClientSocket);
        }

        /// <summary>
        /// 发送数据报文
        /// </summary>
        /// <param name="dataBytes"></param>
        public virtual void SendBytes(byte[] dataBytes)
        {
            if (dataBytes.Length == 0)
            {
                return;
            }

            if (!_isConnected)
            {
                throw (new ApplicationException("没有连接服务器,不能发送数据"));
            }

            //获得报文的编码字节
            byte[] data = _coder.GetEncodingBytes(dataBytes, _resolver);

            _session.ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None,
             new AsyncCallback(SendDataEnd), _session.ClientSocket);
        }


        #endregion

        #region 受保护方法

        /// <summary>
        /// 数据发送完成处理函数
        /// </summary>
        /// <param name="iar"></param>
        protected virtual void SendDataEnd(IAsyncResult iar)
        {
            Socket remoteSocket = (Socket)iar.AsyncState;
            int sent = remoteSocket.EndSend(iar);
            //Debug.Assert(sent != 0);
        }

        /// <summary>
        /// 建立Tcp连接后处理过程
        /// </summary>
        /// <param name="iar">异步Socket</param>
        protected virtual void Connected(IAsyncResult iar)
        {
            Socket cliectSocket = (Socket)iar.AsyncState;
            try
            {
                cliectSocket.EndConnect(iar);

                //创建新的会话
                _session = new Session(cliectSocket);
                _isConnected = true;


                SetConnection(_isConnected);
                //触发连接建立事件
                if (ConnectedServer != null)
                {
                    ConnectedServer(this, new NetEventArgs(_session));
                }

                _session.ClientSocket.BeginReceive(_recvDataBuffer, 0,
                 DefaultBufferSize, SocketFlags.None,
                 new AsyncCallback(ReceiveData), cliectSocket);

                Mark(string.Format("连接成功"));

            }
            catch
            {
                //throw new Exception(ex.Message);
                //_isConnected = false;
                ////WriteLog(sex, sex.ErrorCode.ToString());
                //SetConnection(_isConnected);
            }
        }

        /// <summary>
        /// 关闭连接
        /// </summary>
        public virtual void Close()
        {
            if (!_isConnected)
            {
                return;
            }

            _session.Close();
            _session = null;
            _isConnected = false;
        }

        public virtual void SetConnection(bool IsConnected)
        {
            //if (!IsConnected && cliectSocket != null)
            //{
            //    state.IsReceiveThreadAlive = false;

            //    try
            //    {
            //        if (statelst.Contains(state))
            //            statelst.Remove(state);

            //        state.workSocket.Shutdown(SocketShutdown.Both);
            //        state.workSocket.Close();
            //    }
            //    catch (Exception Ex)
            //    {
            //        //WriteLog(Ex, "When release socket connection.");
            //    }
            //}

            if (OnConnectionChanged != null)
                OnConnectionChanged(this, new EventArgCollection.ConnectionEventArgs() { IsConnected = IsConnected });
        }

        public void Mark(string s)
        {
            var Id = System.Threading.Thread.CurrentThread.ManagedThreadId;

            if (OnSocketEventRaised != null)
                OnSocketEventRaised(null, new EventArgCollection.SocketEventArgs() { Msg = string.Format("[线程ID:{0}] {1}", Id, s) });
        }

        public void WriteLog(Exception exp, string msg)
        {
            if (OnSocketErrorRaised != null)
                OnSocketErrorRaised(exp.Message, new EventArgCollection.SocketErrorEventArgs() { Exp = exp, Msg = msg });
        }


        /// <summary>
        /// 数据接收处理函数
        /// </summary>
        /// <param name="iar">异步Socket</param>
        protected virtual void ReceiveData(IAsyncResult iar)
        {
            Socket remote = (Socket)iar.AsyncState;
            try
            {
                int recv = remote.EndReceive(iar);
                if (recv == 0)
                {
                    _session.TypeOfExit = Session.ExitType.NormalExit;
                    if (DisConnectedServer != null)
                    {
                        DisConnectedServer(this, new NetEventArgs(_session));
                    }
                    return;
                }

                byte[] receiveDataBytes = _coder.GetDecodingBytes(_recvDataBuffer, recv);

                //ConcurrentDictionary<int, byte[]> dic = new ConcurrentDictionary<int, byte[]>();  

                //string receivedData = _coder.GetEncodingString(_recvDataBuffer, recv);

                //通过事件发布收到的报文
                if (ReceivedDatagram != null)
                {
                    ICloneable copySession = (ICloneable)_session;
                    Session clientSession = (Session)copySession.Clone();
                    clientSession.RecvDataBuffer = new byte[receiveDataBytes.Length];

                    Array.ConstrainedCopy(receiveDataBytes, 0, clientSession.RecvDataBuffer, 0, receiveDataBytes.Length);
                    //clientSession.Datagram = newDatagram;

                    //发布一个报文消息
                    ReceivedDatagram(this, new NetEventArgs(clientSession));

                    if (_resolver != null)
                    {
                        //if (_session.Datagram != null && _session.Datagram.Length != 0)
                        //{
                        //    receivedData = _session.Datagram + receivedData;
                        //}

                        //string[] recvDatagrams = _resolver.Resolve(ref receivedData);
                        //foreach (string newDatagram in recvDatagrams)
                        //{
                        //    ICloneable copySession = (ICloneable)_session;
                        //    Session clientSession = (Session)copySession.Clone();
                        //    clientSession.Datagram = newDatagram;

                        //    //发布一个报文消息
                        //    ReceivedDatagram(this, new NetEventArgs(clientSession));
                        //}

                        ////剩余的代码片断,下次接收的时候使用
                        //_session.Datagram = receivedData;
                    }
                    else
                    {
                        //ICloneable copySession = (ICloneable)_session;
                        //Session clientSession = (Session)copySession.Clone();
                        //clientSession.Datagram = receivedData;

                        //ReceivedDatagram(this, new NetEventArgs(clientSession));
                    }

                }//end of if(ReceivedDatagram != null)

                //继续接收数据
                _session.ClientSocket.BeginReceive(_recvDataBuffer, 0, DefaultBufferSize, SocketFlags.None,
                 new AsyncCallback(ReceiveData), _session.ClientSocket);
            }
            catch (SocketException ex)
            {
                //主机端退出
                if (10054 == ex.ErrorCode)
                {
                    _session.TypeOfExit = Session.ExitType.ExceptionExit;

                    if (DisConnectedServer != null)
                    {
                        DisConnectedServer(this, new NetEventArgs(_session));
                    }
                    //_isConnected = false;
                    //WriteLog(ex, ex.ErrorCode.ToString());
                }
                else
                {
                    //throw (ex);

                }

            }
            catch (ObjectDisposedException ex)
            {
                if (ex != null)
                {
                    ex = null;
                    //DoNothing;
                }
                //_isConnected = false;
            }
        }

        #endregion
    }

事件参数设定

public class EventArgCollection
    {
        /// <summary>
        /// ConnectionEventArgs
        /// </summary>
        public class ConnectionEventArgs : EventArgs
        {
            public bool IsConnected { get; set; }
        }

        /// <summary>
        /// SocketEventArgs
        /// </summary>
        public class SocketEventArgs : EventArgs
        {
            /// <summary>
            /// ClientName
            /// </summary>
            public string ClientName { get; set; }

            /// <summary>
            /// IsConnect
            /// </summary>
            public bool IsConnect { get; set; }

            /// <summary>
            /// Message
            /// </summary>
            public string Msg { get; set; }
        }

        /// <summary>
        /// ErrorEventArgs
        /// </summary>
        public class SocketErrorEventArgs : EventArgs
        {
            /// <summary>
            /// Exception
            /// </summary>
            public Exception Exp { get; set; }
            /// <summary>
            /// Message
            /// </summary>
            public string Msg { get; set; }
        }
    }
    /// <summary> 
    /// 网络通讯事件模型委托 
    /// </summary> 
    public delegate void NetEvent(object sender, NetEventArgs e);

连接处理通用

public class Transmitter_Network
    {
        public byte[] m_HeadBytes = new byte[4] { 0xfa, 0xfb, 0xfc, 0xfd };    //字头信息

        #region ** 内部私有变量 **

        NetClient m_NetClient;
        private bool _isConnected = false;
        #endregion

        #region ** 构造函数 **
        public Transmitter_Network()
        {
            _ThreadIsWork = true;
            _ThreadIsPause = false;
            CreateWorkThread();

            _ThreadIsWork_Send = true;
            _ThreadIsPause_Send = false;
            CreateWorkThread_Send();

            NetInitializeComponent();
        }

        #endregion

        #region ** 数据传输 **

        private void NetInitializeComponent()
        {
            m_NetClient = new NetClient(new Coder(Coder.EncodingMothord.Default));

            //m_NetClient.Resovlver=new DatagramResolver("]}");

            m_NetClient.Resovlver = new DatagramResolver(m_HeadBytes);

            m_NetClient.ReceivedDatagram += M_NetClient_ReceivedDatagram;

            m_NetClient.DisConnectedServer += M_NetClient_DisConnectedServer;

            m_NetClient.ConnectedServer += M_NetClient_ConnectedServer;

            m_NetClient.OnSocketErrorRaised += M_NetClient_OnSocketErrorRaised;

            m_NetClient.OnSocketEventRaised += M_NetClient_OnSocketEventRaised;

            //m_NetClient.Connect("192.168.1.166", 6500);
            //m_NetClient.Connect("10.10.100.254", 8899);
        }

        //public event EventHandler<EventArgCollection.ConnectionEventArgs> OnConnectionChanged;

        public event EventHandler<EventArgCollection.SocketEventArgs> OnSocketEventRaised;

        public event EventHandler<EventArgCollection.SocketErrorEventArgs> OnSocketErrorRaised;

        private void M_NetClient_OnSocketEventRaised(object sender, EventArgCollection.SocketEventArgs e)
        {
            //throw new NotImplementedException();
            if (OnSocketEventRaised != null)
                OnSocketEventRaised(null, new EventArgCollection.SocketEventArgs() { Msg = string.Format("[线程ID:{0}] {1}", "", e.Msg) });
        }

        private void M_NetClient_OnSocketErrorRaised(object sender, EventArgCollection.SocketErrorEventArgs e)
        {
            //throw new NotImplementedException();
            if (OnSocketErrorRaised != null)
                OnSocketErrorRaised(e.Exp.Message, new EventArgCollection.SocketErrorEventArgs() { Exp = e.Exp, Msg = e.Msg });
        }

        private void M_NetClient_ConnectedServer(object sender, NetEventArgs e)
        {
            //throw new NotImplementedException();
            string info = string.Format("A Client:{0} connect server :{1}", e.ClientSession,
             e.ClientSession.ClientSocket.RemoteEndPoint.ToString());

        }

        private void M_NetClient_DisConnectedServer(object sender, NetEventArgs e)
        {
            //throw new NotImplementedException();
            string info;

            if (e.ClientSession.TypeOfExit == Session.ExitType.ExceptionExit)
            {
                info = string.Format("A Client Session:{0} Exception Closed.",
                 e.ClientSession.ID);
            }
            else
            {
                info = string.Format("A Client Session:{0} Normal Closed.",
                 e.ClientSession.ID);
            }
        }
        DateTime time_Main0 = DateTime.Now;
        TimeSpan timeSpan_Main = new TimeSpan(0, 0, 0, 0);
        int RDataCount = 0;
        public delegate void RuntimeUpdateEventDelegate(TimeSpan TimeSpan, int RDataCount, int WDataCount);
        public event RuntimeUpdateEventDelegate RuntimeUpdate;

        public delegate void MyReceiveDataEventDelegate(byte[] dataBytes);
        public event MyReceiveDataEventDelegate MyReceiveData;

        public delegate void MyReceiveCommandEventDelegate(byte[] dataBytes);
        public event MyReceiveCommandEventDelegate MyReceiveCommand;

        public delegate void MySendDataEventDelegate(byte[] dataBytes);
        public event MySendDataEventDelegate MySendData;
        private void M_NetClient_ReceivedDatagram(object sender, NetEventArgs e)
        {
            //throw new NotImplementedException();
            int DataByteLength = e.ClientSession.RecvDataBuffer.Length;
            byte[] ReceiveDataBytes = new byte[DataByteLength];
            Array.ConstrainedCopy(e.ClientSession.RecvDataBuffer, 0, ReceiveDataBytes, 0, DataByteLength);

            if (MyReceiveData != null)
                MyReceiveData(ReceiveDataBytes);

            WdataCount = RDataCount - WdataCount;

            RDataCount = Split_ReceiveDataBytes(ReceiveDataBytes);

            DateTime time_Main1 = DateTime.Now;
            timeSpan_Main = time_Main1.Subtract(time_Main0);
            time_Main0 = time_Main1;
            if (RuntimeUpdate != null)
                RuntimeUpdate(timeSpan_Main, RDataCount, WdataCount);

        }
        
        object obj = new object();
        private int Split_ReceiveDataBytes(byte[] ReceiveDataBytes)
        {
            int dataCount = 0;

            for (int i = 0; i < ReceiveDataBytes.Length; i++)
            {
                if (i + 4 < ReceiveDataBytes.Length)
                {
                    if (ReceiveDataBytes[i] == m_HeadBytes[0] && ReceiveDataBytes[i + 1] == m_HeadBytes[1] && ReceiveDataBytes[i + 2] == m_HeadBytes[2] && ReceiveDataBytes[i + 3] == m_HeadBytes[3])
                    {
                        //找到 
                        int dataLength = Coder.ByteToInt32(ReceiveDataBytes[i + 4]);
                        byte[] dataBytes = new byte[dataLength];
                        if (i + 5 + dataLength - 1 < ReceiveDataBytes.Length)
                        {
                            Array.ConstrainedCopy(ReceiveDataBytes, i + 5, dataBytes, 0, dataLength);
                            lock (this)
                            {
                                if (CheckDigitByte(dataBytes))
                                {
                                    //校验检测OK
                                    if (dataBytes[0] == 0x25 && dataBytes[1] == 0x01 && dataBytes[2] == 0x02)
                                    {
                                        try
                                        {
                                            receive_Q.Enqueue(dataBytes);
                                        }
                                        catch
                                        {

                                        }
                                    }
                                    else
                                    {
                                        if (MyReceiveCommand != null)
                                            MyReceiveCommand(dataBytes);
                                    }
                                }
                            }
                            //ResolveReceiveData(dataBytes);
                            i = i + 5 + dataLength - 1;
                            dataCount++;
                        }
                    }
                }
            }

            return dataCount;
        }

        /// <summary>
        /// 校验检测
        /// </summary>
        /// <param name="dataBytes"></param>
        /// <returns></returns>
        public bool CheckDigitByte(byte[] dataBytes)
        {
            if (dataBytes.Length < 2) return false;
            byte CheckDigitByte = dataBytes[dataBytes.Length - 1];
            byte dataByte = new byte();

            for (int i = 0; i < dataBytes.Length - 1; i++)
            {
                dataByte += dataBytes[i];
            }

            return dataByte == CheckDigitByte;
        }

        #endregion

        #region ** 属性 **

        public bool IsConnected
        {
            get
            {
                this._isConnected = m_NetClient.IsConnected;
                return this._isConnected;
            }
        }


        public object Dispatcher { get; private set; }

        #endregion

        #region ** 公共方法 **

        /// <summary>
        /// 模拟人连接
        /// </summary>
        public void NetworkConnect()
        {
            try
            {
                NetworkConnect("127.0.0.1", 8899);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// 模拟人连接
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="Port"></param>
        public void NetworkConnect(string IP, int Port)
        {
            try
            {
                m_NetClient.Connect(IP, Port);
                Thread.Sleep(100);   //等1秒
                this._isConnected = m_NetClient.IsConnected;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

        }

        /// <summary>
        /// 网络连接断开
        /// </summary>
        public void NetworkDisconnect()
        {
            try
            {
                m_NetClient.Disconnect();
                Thread.Sleep(100);   //等1秒
                this._isConnected = m_NetClient.IsConnected;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void AddSendBytes(byte[] dataBytes)
        {
            try
            {
                //Cache_SendDataBytes.Add(dataBytes);
                //入队
                System.Diagnostics.Debug.WriteLine(string.Format("{0},{1}", Common.Converter.ByteConverter.ByteArrayToHexString(dataBytes), send_Q.Count));
                send_Q.Enqueue(dataBytes);
            }
            catch (Exception)
            {

                //throw;
            }
        }

        /// <summary>
        /// 发送数据到模拟人
        /// </summary>
        /// <param name="dataBytes"></param>
        private void SendBytes(byte[] dataBytes)
        {
            try
            {
                m_NetClient.SendBytes(dataBytes);

                if (MySendData != null)
                    MySendData(dataBytes);
            }
            catch
            {
                //MessageBox.Show(ex.Message, "错误");
            }
        }

        #endregion

        #region ** 读取队列数据作业线程 **

        //private List<byte[]> Cache_ReceiveDataBytes = new List<byte[]>();
        Queue receive_Q = new Queue();

        Thread WorkThread;
        AutoResetEvent WorkResetEvent = new AutoResetEvent(true);

        private bool _ThreadIsWork = false;
        private bool _ThreadIsPause = false;

        /// <summary>
        /// 创建前线程
        /// </summary>
        public void CreateWorkThread()
        {
            this.WorkThread = new Thread(new ThreadStart(this.WorkThreedFun));
            this.WorkThread.IsBackground = true;
            this.WorkThread.Start();
        }

        /// <summary>
        /// 
        /// </summary>
        public void DestroyWorkThread()
        {
            _ThreadIsWork = false;
            Thread.Sleep(100);
            WorkThread.DisableComObjectEagerCleanup();
        }

        /// <summary>
        /// 执行线程函数
        /// </summary>
        private void WorkThreedFun()
        {
            while (true)
            {
                if (!_ThreadIsWork || _ThreadIsPause)
                {
                    this.WorkResetEvent.WaitOne();
                }
                this.DoWork();

            }
        }

        //int workRunTime = 0;

        DateTime time_Main20 = DateTime.Now;
        TimeSpan timeSpan_Main2 = new TimeSpan(0, 0, 0, 0);

        public delegate void RuntimeUpdate2EventDelegate(TimeSpan TimeSpan, int DataCount);
        //public event RuntimeUpdate2EventDelegate RuntimeUpdate2;



        int WdataCount = 0;
        /// <summary>
        /// 取出数据
        /// </summary>
        private void DoWork()
        {
            while (receive_Q.Count > 0)
            {
                //出队
                byte[] dataBytes = (byte[])receive_Q.Dequeue();
                if (dataBytes != null)
                {
                    //发送数据
                    //SendBytes(dataBytes);
                    if (MyReceiveCommand != null)
                        MyReceiveCommand(dataBytes);
                }
                //小于20条快速取出
                if (receive_Q.Count < 20)
                    System.Threading.Thread.Sleep(10);
            };
        }

        private byte[] ReadCacheData()
        {
            byte[] dataBytes = new byte[0];
            //if (Cache_ReceiveDataBytes.Count >= 10)
            //{
            //    dataBytes = Cache_ReceiveDataBytes[0];
            //    Cache_ReceiveDataBytes.RemoveAt(0);
            //}

            return dataBytes;
        }


        /// <summary>
        /// 查找是否存在的字节数据
        /// </summary>
        /// <param name="byteDataArray"></param>
        /// <param name="byteData"></param>
        /// <returns></returns>
        private bool InByte(byte[] byteDataArray, byte byteData)
        {
            if (byteDataArray == null)
                return false;
            for (int i = 0; i < byteDataArray.Length; i++)
            {
                if (byteDataArray[i] == byteData)
                {
                    return true;
                }
            }
            return false;
        }

        #endregion

        #region ** 发送队列数据作业线程 **

        Queue send_Q = new Queue();

        Thread WorkThread_Send;
        AutoResetEvent WorkResetEvent_Send = new AutoResetEvent(true);

        private bool _ThreadIsWork_Send = false;
        private bool _ThreadIsPause_Send = false;

        /// <summary>
        /// 创建前线程
        /// </summary>
        public void CreateWorkThread_Send()
        {
            this.WorkThread_Send = new Thread(new ThreadStart(this.WorkThreedFun_Send));
            this.WorkThread_Send.IsBackground = true;
            this.WorkThread_Send.Start();
        }

        /// <summary>
        /// 
        /// </summary>
        public void DestroyWorkThread_Send()
        {
            _ThreadIsWork_Send = false;
            Thread.Sleep(100);
            WorkThread_Send.DisableComObjectEagerCleanup();
        }

        /// <summary>
        /// 执行线程函数
        /// </summary>
        private void WorkThreedFun_Send()
        {
            while (true)
            {
                if (!_ThreadIsWork_Send || _ThreadIsPause_Send)
                {
                    this.WorkResetEvent_Send.WaitOne();
                }
                this.DoWork_Send();

            }
        }

        //int workRunTime_Send = 0;

        DateTime time_Main20_Send = DateTime.Now;
        TimeSpan timeSpan_Main2_Send = new TimeSpan(0, 0, 0, 0);

        public delegate void RuntimeUpdate2_SendEventDelegate(TimeSpan TimeSpan, int DataCount);
        //public event RuntimeUpdate2_SendEventDelegate RuntimeUpdate2_Send;

        //int WdataCount_Send = 0;
        /// <summary>
        /// 取出数据
        /// </summary>
        private void DoWork_Send()
        {
            while (send_Q.Count > 0)
            {
                //出队
                System.Diagnostics.Debug.WriteLine(string.Format("{0}", send_Q.Count));
                byte[] dataBytes = (byte[])send_Q.Dequeue();
                System.Diagnostics.Debug.WriteLine(string.Format("{0}", Common.Converter.ByteConverter.ByteArrayToHexString(dataBytes)));
                if (dataBytes != null)
                {
                    //发送数据
                    SendBytes(dataBytes);
                }
                System.Threading.Thread.Sleep(10);
            };

        }

        private byte[] ReadCacheData_Send()
        {
            byte[] dataBytes = new byte[0];
            //if (Cache_ReceiveDataBytes.Count >= 10)
            //{
            //    dataBytes = Cache_ReceiveDataBytes[0];
            //    Cache_ReceiveDataBytes.RemoveAt(0);
            //}

            return dataBytes;
        }

        #endregion

        #region ** 私有方法 **


        #endregion
    }

调用

Transmitter_Network Transmitter_Network = new Transmitter_Network();
Transmitter_Network.NetworkConnect(Ip, Port);
if(Transmitter_Network.IsConnected)
{
    //成功
}
else
{
    //失败
}

 

C# UDP通讯实战:高效数据接收与多线程处理 本文深入探讨C# UDP通讯中数据接收的阻塞问题及其多线程解决方案。通过实战代码演示如何创建独立接收线程、安全处理跨线程数据通信,并优化缓冲区与异常处理,从而构建高效、稳定的UDP数据接收程序,适用于物联网、游戏服务器等高实时性场景。 阅读详情

相关推荐

用C#搭多协议传感器采集平台:串口/WiFi/USB通吃,MQTT+InfluxDB实现数据全链路管理

先建一个SensorData类,存所有传感器的统一数据格式;再定义// Model/SensorData.cs:统一传感器数据结构set;} // 设备ID(如"STM32_001")set;} // 传感器类型(如"温湿度")set;} // 数据键值对(如{"温度":25.3, "湿度":60.2})set;// 时间戳// Interface/IDataCollector.cs:采集器接口} // 采集器名称(如"串口采集器")} // 是否正在采集// 数据采集事件(统一数据出口)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 423

C#WIFI搜索与连接

特别声明,本文转自:https://www.cnblogs.com/ywf520/p/6502452.html 1、功能搜索WIFI并连接 2、所用工具及资源:VS2012 Managed Wifi API(即:引用ManagedWifi.dll文件地址:http://files.cnblogs.com/files/ywf520/ManagedWifi.zip) 3、运行截图及工程截图: 工程目录 结构 4、具体代码实现 wifiSo.cs using System; .

奋斗的菜鸟博客 7440

基于MFC的WiFi检测软件设计与实现

你看,一个看似简单的WiFi检测软件,背后竟然藏着这么多门道:底层API调用 → 数据获取多线程架构 → 响应性保障数据解析 → 信息提炼图形界面 → 用户体验安全存储 → 长期可用日志分析 → 价值延伸它早已不是一个“玩具级”小程序,而是一个完整的无线网络诊断平台雏形。未来还能加什么功能?📊 实时信号强度曲线图🧭 信道干扰热力图(找出最拥挤的频段)🔍 MAC地址厂商识别(“这个设备是谁家的摄像头?”)

weixin_42613018的博客 426

如何用C#实现上位机与下位机之间的Wi-Fi通信?

我用C搞过一个很菜的玩具视频车,上位机是Ubuntu笔记本,下位机是树莓派板子,树莓派板插个USB-Wifi网卡连路由器和主机通信。笔记本发指令给板子实现小车移动,小车用USB摄像头采集图片一帧一帧的回传给主机显示。你既然用了wifi,那么只要上位机和下位机的对应wifi网卡都具有ip地址以及其协议支持,那么和网络编程没啥子明显区别的吧……最简单的办法,直接用socket 就和串口一样了 一边发一边接 谁是server无所谓。p.s. arduino的网页也是基于socket的。

linlaoshi2009的博客 939

探索inSSIDer:无线网络扫描工具的C#源码解析

htmltable {th, td {th {pre {简介:inSSIDer是一款用于检测Wi-Fi信号强度和优化无线网络配置的工具。通过对其源代码的深入分析,我们可以掌握C#编程技巧,理解Wi-Fi网络分析原理,学习GUI设计,以及多线程和异步编程等关键技术。本文将探讨inSSIDer的C#源代码,包括其面向对象设计、Wi-Fi API使用、信号强度计算、频道冲突检测、WPF界面设计、数据存储、多线程处理和版本控制等关键方面。

weixin_35935514的博客 658

C#编写wifi无线通讯示例

wifi无线通讯示例,微软提供。适用于wince手机,windowsmobile系统。语言为C#。

第六届全国大学生工程训练竞赛国赛 -智能物料搬运-规则

我发布这一个博客只是为了方便来者去看比赛的规则,不关心版权等问题 如有问题请与我联系 以下部分是国赛的初赛部分的 规则 关于wifi网络的说明 UDP发送端指令源代码: class Program { private static Socket sock; private static IPEndPoint iep1; pri...

jeason的博客 9540

c#调用wlanapi连接到wifi示例

c#调用wlanapi连接到wifi示例,适用于xp。 win7可能需要稍微修改代码。

告别Arduino C++!用NanoFramework给你的ESP32刷个‘C#系统’,实现WiFi蓝牙多线程

本文介绍了如何利用NanoFramework将C#引入ESP32开发,替代传统的Arduino C++方式。通过详细的开发环境搭建、WiFi蓝牙实现及多线程编程示例,展示了NanoFramework在嵌入式开发中的高效与便捷,特别适合需要快速开发复杂物联网应用的场景。

weixin_30896511的博客 465

C#使用wlanapi.dll主动扫描周边wifi并连接。

查找网上很多资料,基本类似,没有找到主动扫描周边wifi的代码,都是被动获取电脑扫描的,时效性太差。没办法,自己研究查找,果然wlanapi.dll里有对应的方法~

Arduino DHT11 ESP8266 在OneNet云平台上读取 温湿度

#include "ESP8266.h" #include "dht11.h" #include "SoftwareSerial.h" #define SSID "540ND" #define PASSWORD "" #define HOST_NAME "api.heclouds.com" #define DEVICE_ID "" #define HOST_PORT (80) String APIKey = " "; #define INTER

weixin_45852947的博客 2430

c# wifi串口通信_C#串口通信 SerialPort类

因为公司项目需要将USB扫码枪改为串口扫码枪,串口扫码的好处在于不需要一个输入框来接受USB扫出来的文本,能解决多个扫码枪一起扫码时的并发问题,所以需要用到多线程及串口技术。一、串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。串口通信(Se...

weixin_39836876的博客 354

Fastp实战指南:高效处理fastq数据的质控技巧

本文是Fastp实战指南,详细介绍了如何使用Fastp工具高效处理fastq数据的质控技巧。从数据清洗的必要性、基础命令解析,到高级参数定制、UMI数据处理及批量自动化流程,提供一站式解决方案。Fastp以其“All-in-One”的快速质控能力,帮助用户确保测序数据质量,为后续生物信息学分析奠定可靠基础。

weixin_29254029的博客 389

UE5工业数字孪生项目:多线程串口通讯与蓝牙WiFi集成实战

在实时渲染与物联网应用开发中,多线程编程是解决I/O阻塞、保障程序流畅性的核心技术。其原理在于通过创建独立的工作线程处理耗时操作(如串口读写、网络通信),避免阻塞主线程(如游戏线程),从而维持高帧率与响应速度。这项技术的核心价值在于有效分离计算密集型任务与用户交互,是构建高性能、实时数据可视化系统的基石。在工业数字孪生、机器人控制和物联网数据面板等场景中,稳定高效的外部硬件通讯是项目成功的关键。本文聚焦于UE5引擎环境,深入剖析如何设计并实现一套基于“生产者-消费者”模型的多线程通讯架构。该方案不仅覆盖了串

weixin_26798991的博客 296

ThinkPHP 8.1 + think-swoole 4.1 实战:5分钟搞定WebSocket聊天室(附完整代码)

本文详细介绍了如何使用ThinkPHP 8.1和think-swoole 4.1快速构建高并发WebSocket聊天室。通过5分钟实战教程,开发者可以轻松实现用户列表、消息广播等核心功能,支持2000+并发连接,适用于客服系统、在线协作等实时通信场景。

ol789012345的博客 126

大彩串口屏+LUA避坑指南:从Flash读写到控件状态配置的5个常见问题

本文针对大彩串口屏的LUA脚本开发,深度剖析了Flash数据存储与控件状态配置中的5个常见陷阱。重点讲解了如何通过标志位安全初始化Flash、正确处理多字节数据转换,以及如何精准配置按钮与文本控件的状态与事件响应,帮助开发者提升开发效率与代码可靠性。

weixin_27945229的博客 242

Wifi断网自动重连

最近宿舍wifi不知道为什么不稳定

FaaronZheng的专栏 4902

power bi 演唱会-佐罗

我是业务分析人员,注重使用性,因此,课程不到 30% 的内容就可以解决目前为止我碰到的所有业务问题,剩下的 70% 内容是帮助我提升,优化,升华,精益求精用的,比如第三方工具,比如代码运行速度优化,比如查询逻辑优化等等。系统性上来说,结构明晰,安排上非常有条理,层层递进;《BI 真经》,中有真经二字,略显夸大,而当我第一次证明了这点的时候,我也非常惊讶,这就是我做以下所有事情的一切动力。《BI 真经》综合考量思想性,系统性,本质性,创新性,通用性,技巧性,启发性,对比其他课程有压倒性的显著优势。

v_1090213742的博客 911

手机组态软件 APP监控西门子200smart PLC C#全套源代码 1,C#开发上位机手机APP

实测WiFi通信延迟控制在200ms内算合格,车间环境记得把手机WiFi的休眠策略改成永不休眠,不然断线重连能让你怀疑人生。源码里有个隐藏的调试模式,连续点击关于页面五次激活,能看原始通讯报文。最近搞了个用C#开发安卓APP监控西门子200smart PLC的活,核心就三点:手机组态、WiFi通信、源码可玩性。这段代码的骚操作在于登录失败时故意延迟2秒,别小看这2秒,实测能防住80%的暴力破解。1,C#开发上位机手机APP,自己写的程序可提供部分。1,C#开发上位机手机APP,自己写的程序可提供部分。

CLRNqORLaTda的博客 663

【cmd】Win10家庭版找不到 gpedit.msc (组策略)的解决方法

目录 一、创建cmd文件 二、以“管理员身份”运行“gpedit.cmd”文件 三、运行“gpedit.msc”命令查看组策略 一、创建cmd文件 (1)新建一个文件名为“gpedit.txt”的txt文本文档: (2)文本中写入以下内容: @echo off pushd "%~dp0" dir /b C:\Windows\servicing\Packages\Micros...

顾三殇 —— 博客空间(软件测试) 4万+

Nova — GPU/vGPU 虚拟机

目录 文章目录目录云主机使用显卡的实现方式虚拟显卡物理显卡直通物理显卡虚拟化 云主机使用显卡的实现方式 采用虚拟显卡 采用物理显卡直通 采用物理显卡虚拟化 虚拟显卡 虚拟显卡技术,主要用于虚拟机 Remote Console 领域,如:VNC(Virtual Network Computing,虚拟网络计算机),它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上。 VNC 主要由 VNC server 和 VNC viewer 两部分组成。用户需先将 VNC server 安装在被远程操控的计算

烟云的计算 2426

android休眠wifi不关闭吗,Android_设置Android设备WIFI在休眠时永不断开的代码实现,MainActivity如下: package cc.ab; - phpStudy...

设置Android设备WIFI在休眠时永不断开的代码实现MainActivity如下:package cc.ab;import android.os.Bundle;import android.provider.Settings;import android.app.Activity;/*** Demo描述:* 设置设备在睡眠期间始终保持WLAN开启.** 参考资料:* 1 http://stac...

weixin_39925413的博客 352

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1526

C#全套源代码:手机组态APP监控西门子200smart PLC,VS2019开发安卓应用,无...

实测WiFi通信延迟控制在200ms内算合格,车间环境记得把手机WiFi的休眠策略改成永不休眠,不然断线重连能让你怀疑人生。最近搞了个用C#开发安卓APP监控西门子200smart PLC的活,核心就三点:手机组态、WiFi通信、源码可玩性。注意安卓上拖拽时的ZIndex问题,新控件可能被压在底层,记得设置BringToFront()。这段代码的骚操作在于登录失败时故意延迟2秒,别小看这2秒,实测能防住80%的暴力破解。不过密码用明文存着确实拉胯,正式环境建议上MD5加盐,咱这演示版就凑合用吧。

2500_94318063的博客 384

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【移动开发】WIFI热点通信(一)

之前调查过Android中WIFI模块的使用,也写过两篇学习总结的文章(http://smallwoniu.blog.51cto.com/3911954/1334951),后来发现DEMO里面还是有许多不足之处,前段时间有不少人Q我,问到WIFI模块中的一些细节,小弟这里只能说声抱歉,因为当时的我也还没研究到那个层次呀。。。,后来毕业设计选题干脆直接选择...

weixin_33709364的博客 408

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: C# ble 4.0 低能耗 蓝牙交互
下一篇: inno setup 打包脚本相关编辑
code_long
博客等级 码龄16年 35粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值