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(); } } } }); }
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); } } } }); } } }
/// <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); } } }
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); } }