Ejemplo n.º 1
0
        internal void Start()
        {
            isStart = true;
            Task.Run(() =>
            {
                while (isStart)
                {
                    if (RunningTasks.Count < MaxTaskCount)
                    {
                        DataInfo analysisDataInfo;
                        if (analysisDataIds.TryDequeue(out analysisDataInfo))
                        {
                            Task task = new Task(() =>
                            {
                                var analysisData    = DbHelper.Current.Get <byte[]>(DataType.ReceiveType, analysisDataInfo.ID);
                                var state           = analysisDataInfo.State;
                                var buffer          = analysisData;
                                var commandDataList = new List <byte[]>();
                                var index           = 0;
                                List <byte> bytes   = null;

                                while (index < buffer.Length)
                                {
                                    if (bytes == null)
                                    {
                                        if ((index + 3) < buffer.Length &&
                                            buffer[index] == PoolCommand.DefaultPrefixBytes[0] &&
                                            buffer[index + 1] == PoolCommand.DefaultPrefixBytes[1] &&
                                            buffer[index + 2] == PoolCommand.DefaultPrefixBytes[2] &&
                                            buffer[index + 3] == PoolCommand.DefaultPrefixBytes[3])
                                        {
                                            bytes = new List <byte>();
                                            bytes.AddRange(PoolCommand.DefaultPrefixBytes);
                                            index += 4;
                                        }
                                        else
                                        {
                                            index++;
                                        }
                                    }
                                    else
                                    {
                                        if ((index + 3) < buffer.Length &&
                                            buffer[index] == PoolCommand.DefaultSuffixBytes[0] &&
                                            buffer[index + 1] == PoolCommand.DefaultSuffixBytes[1] &&
                                            buffer[index + 2] == PoolCommand.DefaultSuffixBytes[2] &&
                                            buffer[index + 3] == PoolCommand.DefaultSuffixBytes[3])
                                        {
                                            bytes.AddRange(PoolCommand.DefaultSuffixBytes);
                                            commandDataList.Add(bytes.ToArray());
                                            bytes = null;

                                            index += 4;
                                        }
                                        else
                                        {
                                            bytes.Add(buffer[index]);
                                            index++;
                                        }
                                    }
                                }

                                foreach (var data in commandDataList)
                                {
                                    try
                                    {
                                        var cmd = PoolCommand.ConvertBytesToMessage(data);
                                        if (cmd != null)
                                        {
                                            MsgPool.Current.AddCommand(new CommandState {
                                                State = state, Command = cmd
                                            });
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        LogHelper.Error("Error occured on deserialize messgae: " + ex.Message, ex);
                                    }
                                }
                            });
                            task.ContinueWith(t =>
                            {
                                RunningTasks.Remove(task);
                            });
                            RunningTasks.Add(task);
                            task.Start();
                        }
                    }
                }
            });
        }
Ejemplo n.º 2
0
        private void processReceivedDataQueue()
        {
            while (isStarted)
            {
                if (this.receivedDataQueue.Count > 0)
                {
                    var item = receivedDataQueue.Dequeue();

                    Task.Run(() => {
                        var state           = item.Key;
                        var buffer          = item.Value;
                        var commandDataList = new List <byte[]>();
                        var index           = 0;
                        List <byte> bytes   = null;

                        while (index < buffer.Length)
                        {
                            if (bytes == null)
                            {
                                if ((index + 3) < buffer.Length &&
                                    buffer[index] == PoolCommand.DefaultPrefixBytes[0] &&
                                    buffer[index + 1] == PoolCommand.DefaultPrefixBytes[1] &&
                                    buffer[index + 2] == PoolCommand.DefaultPrefixBytes[2] &&
                                    buffer[index + 3] == PoolCommand.DefaultPrefixBytes[3])
                                {
                                    bytes = new List <byte>();
                                    bytes.AddRange(PoolCommand.DefaultPrefixBytes);
                                    index += 4;
                                }
                                else
                                {
                                    index++;
                                }
                            }
                            else
                            {
                                if ((index + 3) < buffer.Length &&
                                    buffer[index] == PoolCommand.DefaultSuffixBytes[0] &&
                                    buffer[index + 1] == PoolCommand.DefaultSuffixBytes[1] &&
                                    buffer[index + 2] == PoolCommand.DefaultSuffixBytes[2] &&
                                    buffer[index + 3] == PoolCommand.DefaultSuffixBytes[3])
                                {
                                    bytes.AddRange(PoolCommand.DefaultSuffixBytes);
                                    commandDataList.Add(bytes.ToArray());
                                    bytes = null;

                                    index += 4;
                                }
                                else
                                {
                                    bytes.Add(buffer[index]);
                                    index++;
                                }
                            }
                        }

                        if (this.ReceivedCommandAction != null)
                        {
                            foreach (var data in commandDataList)
                            {
                                try
                                {
                                    var cmd = PoolCommand.ConvertBytesToMessage(data);
                                    if (cmd != null)
                                    {
                                        HeartbeatCommand.UpdateHeartTime(state);
                                        this.ReceivedCommandAction(state, cmd);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    LogHelper.Error("Error occured on deserialize messgae: " + ex.Message, ex);
                                }
                            }
                        }
                    });
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 接收事件响应函数,接收的逻辑
        /// </summary>
        /// <param name="receiveEventArgs"></param>
        private void ProcessReceive(SocketAsyncEventArgs receiveEventArgs)
        {
            AsyncSocketUserToken userToken = receiveEventArgs.UserToken as AsyncSocketUserToken;

            if (userToken.ConnectSocket == null)
            {
                return;
            }
            userToken.ActiveDateTime = DateTime.Now;
            if (userToken.ReceiveEventArgs.BytesTransferred > 0 && userToken.ReceiveEventArgs.SocketError == SocketError.Success)
            {
                HeartbeatCommand.UpdateHeartTime(userToken);

                int offset = userToken.ReceiveEventArgs.Offset;
                int count  = userToken.ReceiveEventArgs.BytesTransferred;

                if (count > 0) //处理接收数据
                {
                    var         buffer          = userToken.ReceiveEventArgs.Buffer;
                    var         commandDataList = new List <byte[]>();
                    var         index           = 0;
                    List <byte> bytes           = null;

                    while (index < buffer.Length)
                    {
                        if (bytes == null)
                        {
                            if ((index + 3) < buffer.Length &&
                                buffer[index] == PoolCommand.DefaultPrefixBytes[0] &&
                                buffer[index + 1] == PoolCommand.DefaultPrefixBytes[1] &&
                                buffer[index + 2] == PoolCommand.DefaultPrefixBytes[2] &&
                                buffer[index + 3] == PoolCommand.DefaultPrefixBytes[3])
                            {
                                bytes = new List <byte>();
                                bytes.AddRange(PoolCommand.DefaultPrefixBytes);
                                index += 4;
                            }
                            else
                            {
                                index++;
                            }
                        }
                        else
                        {
                            if ((index + 3) < buffer.Length &&
                                buffer[index] == PoolCommand.DefaultSuffixBytes[0] &&
                                buffer[index + 1] == PoolCommand.DefaultSuffixBytes[1] &&
                                buffer[index + 2] == PoolCommand.DefaultSuffixBytes[2] &&
                                buffer[index + 3] == PoolCommand.DefaultSuffixBytes[3])
                            {
                                bytes.AddRange(PoolCommand.DefaultSuffixBytes);
                                commandDataList.Add(bytes.ToArray());
                                bytes = null;

                                index += 4;
                            }
                            else
                            {
                                bytes.Add(buffer[index]);
                                index++;
                            }
                        }
                    }

                    if (this.ReceivedCommandAction != null)
                    {
                        foreach (var data in commandDataList)
                        {
                            try
                            {
                                var cmd = PoolCommand.ConvertBytesToMessage(data);
                                if (cmd != null)
                                {
                                    this.ReceivedCommandAction(userToken, cmd);
                                }
                            }
                            catch (Exception ex)
                            {
                                LogHelper.Warn($"Error Data from {userToken.Address}:{Base16.Encode(data)}");
                                LogHelper.Error("Error occured on deserialize messgae: " + ex.Message, ex);
                            }
                        }
                    }

                    if (userToken.ConnectSocket == null || userToken.ReceiveEventArgs == null)
                    {
                        return;
                    }

                    bool willRaiseEvent = userToken.ConnectSocket.ReceiveAsync(userToken.ReceiveEventArgs); //投递接收请求
                    if (!willRaiseEvent)
                    {
                        ProcessReceive(userToken.ReceiveEventArgs);
                    }
                }
                else
                {
                    CloseSocket(userToken);
                }
            }
        }
Ejemplo n.º 4
0
        private void processReceive(IAsyncResult ar)
        {
            TcpReceiveState state = (TcpReceiveState)ar.AsyncState;

            try
            {
                //if (state.Stream == null || !state.Stream.CanRead)
                //{
                //    state.Buffer = new byte[m_receiveBufferSize];
                //    state.Stream.BeginRead(state.Buffer, 0, state.Buffer.Length, new AsyncCallback(processReceive), state);
                //}

                int numberOfBytesRead = state.Stream.EndRead(ar);

                if (numberOfBytesRead > 0)
                {
                    //LogHelper.Debug($"Readed {numberOfBytesRead} byte data from {state.Address}");
                    var buffer = new byte[numberOfBytesRead];
                    Array.Copy(state.Buffer, 0, buffer, 0, buffer.Length);
                    //this.receivedDataQueue.Enqueue(new KeyValuePair<TcpReceiveState, byte[]>(state, buffer));
                    var         commandDataList = new List <byte[]>();
                    var         index           = 0;
                    List <byte> bytes           = null;

                    while (index < buffer.Length)
                    {
                        if (bytes == null)
                        {
                            if ((index + 3) < buffer.Length &&
                                buffer[index] == PoolCommand.DefaultPrefixBytes[0] &&
                                buffer[index + 1] == PoolCommand.DefaultPrefixBytes[1] &&
                                buffer[index + 2] == PoolCommand.DefaultPrefixBytes[2] &&
                                buffer[index + 3] == PoolCommand.DefaultPrefixBytes[3])
                            {
                                bytes = new List <byte>();
                                bytes.AddRange(PoolCommand.DefaultPrefixBytes);
                                index += 4;
                            }
                            else
                            {
                                index++;
                            }
                        }
                        else
                        {
                            if ((index + 3) < buffer.Length &&
                                buffer[index] == PoolCommand.DefaultSuffixBytes[0] &&
                                buffer[index + 1] == PoolCommand.DefaultSuffixBytes[1] &&
                                buffer[index + 2] == PoolCommand.DefaultSuffixBytes[2] &&
                                buffer[index + 3] == PoolCommand.DefaultSuffixBytes[3])
                            {
                                bytes.AddRange(PoolCommand.DefaultSuffixBytes);
                                commandDataList.Add(bytes.ToArray());
                                bytes = null;

                                index += 4;
                            }
                            else
                            {
                                bytes.Add(buffer[index]);
                                index++;
                            }
                        }
                    }

                    if (this.ReceivedCommandAction != null)
                    {
                        foreach (var data in commandDataList)
                        {
                            try
                            {
                                var cmd = PoolCommand.ConvertBytesToMessage(data);
                                if (cmd != null)
                                {
                                    HeartbeatCommand.UpdateHeartTime(state);
                                    this.ReceivedCommandAction(state, cmd);
                                }
                            }
                            catch (Exception ex)
                            {
                                LogHelper.Error("Error occured on deserialize messgae: " + ex.Message, ex);
                            }
                        }
                    }
                }

                state.Buffer = new byte[m_receiveBufferSize];
                state.Stream.BeginRead(state.Buffer, 0, state.Buffer.Length,
                                       new AsyncCallback(processReceive), state);
            }
            catch (Exception ex)
            {
                LogHelper.Error("Error occured on receive messgae: " + ex.Message, ex);
                this.CloseSocket(state);
            }
        }