Dreamine.Communication.Core 1.0.2
Dreamine.Communication.Core 통신 기능과 관련 API를 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec 클래스 참조sealed

더 자세히 ...

Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec에 대한 상속 다이어그램 :
Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec에 대한 협력 다이어그램:

클래스

class  FrameReadBuffer

Public 멤버 함수

 DelimiterMessageFrameCodec ()
 DelimiterMessageFrameCodec (string delimiter, Encoding encoding, int maxFrameLength)
async Task WriteFrameAsync (Stream stream, byte[] payload, CancellationToken cancellationToken=default)
async Task< byte[]?> ReadFrameAsync (Stream stream, CancellationToken cancellationToken=default)

Private 멤버 함수

bool TryConsumeBufferedBytes (FrameReadBuffer readBuffer, List< byte > frame, out byte[]? result)
bool EndsWithDelimiter (List< byte > frame)

Private 속성

readonly byte[] _delimiter
readonly int _maxFrameLength
readonly ConditionalWeakTable< Stream, FrameReadBuffer_readBuffers = new()

상세한 설명

지정한 바이트 구분자로 스트림의 메시지 경계를 구분합니다.

DelimiterMessageFrameCodec.cs 파일의 14 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ DelimiterMessageFrameCodec() [1/2]

Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.DelimiterMessageFrameCodec ( )
inline

CRLF, UTF-8 및 1MiB 제한을 사용하는 코덱을 초기화합니다.

DelimiterMessageFrameCodec.cs 파일의 52 번째 라인에서 정의되었습니다.

53 : this("\r\n", Encoding.UTF8, 1024 * 1024)
54 {
55 }

◆ DelimiterMessageFrameCodec() [2/2]

Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.DelimiterMessageFrameCodec ( string delimiter,
Encoding encoding,
int maxFrameLength )
inline

구분자, 인코딩 및 최대 프레임 길이를 지정하여 코덱을 초기화합니다.

매개변수
delimiter메시지 끝을 표시할 문자열입니다.
encoding구분자를 바이트로 변환할 인코딩입니다.
maxFrameLength구분자를 제외한 최대 프레임 바이트 수입니다.
예외
ArgumentExceptiondelimiter 가 비어 있는 경우 발생합니다.
ArgumentNullExceptionencodingnull인 경우 발생합니다.
ArgumentOutOfRangeExceptionmaxFrameLength 가 0 이하인 경우 발생합니다.

DelimiterMessageFrameCodec.cs 파일의 113 번째 라인에서 정의되었습니다.

117 {
118 ArgumentException.ThrowIfNullOrEmpty(delimiter);
119 ArgumentNullException.ThrowIfNull(encoding);
120
121 if (maxFrameLength <= 0)
122 {
123 throw new ArgumentOutOfRangeException(nameof(maxFrameLength));
124 }
125
126 _delimiter = encoding.GetBytes(delimiter);
127 _maxFrameLength = maxFrameLength;
128 }

다음을 참조함 : _delimiter, _maxFrameLength.

멤버 함수 문서화

◆ EndsWithDelimiter()

bool Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.EndsWithDelimiter ( List< byte > frame)
inlineprivate

현재 프레임이 구성된 구분자 바이트로 끝나는지 확인합니다.

매개변수
frame끝부분을 검사할 프레임입니다.
반환값
구분자로 끝나면 true입니다.

DelimiterMessageFrameCodec.cs 파일의 402 번째 라인에서 정의되었습니다.

403 {
404 if (frame.Count < _delimiter.Length)
405 {
406 return false;
407 }
408
409 var start = frame.Count - _delimiter.Length;
410
411 for (var index = 0; index < _delimiter.Length; index++)
412 {
413 if (frame[start + index] != _delimiter[index])
414 {
415 return false;
416 }
417 }
418
419 return true;
420 }

다음을 참조함 : _delimiter.

다음에 의해서 참조됨 : TryConsumeBufferedBytes().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReadFrameAsync()

async Task< byte[]?> Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.ReadFrameAsync ( Stream stream,
CancellationToken cancellationToken = default )
inline

구분자까지의 바이트를 하나의 프레임으로 비동기 읽습니다.

매개변수
stream읽을 스트림입니다.
cancellationToken읽기 취소 요청을 감시하는 토큰입니다.
반환값
구분자를 제외한 프레임이며, 데이터 없이 스트림이 끝나면 null입니다.
예외
ArgumentNullExceptionstreamnull인 경우 발생합니다.
InvalidDataException프레임이 최대 길이를 초과한 경우 발생합니다.
OperationCanceledException작업 취소가 요청된 경우 발생할 수 있습니다.

Dreamine.Communication.Core.Framing.IMessageFrameCodec를 구현.

DelimiterMessageFrameCodec.cs 파일의 255 번째 라인에서 정의되었습니다.

258 {
259 ArgumentNullException.ThrowIfNull(stream);
260
261 var frame = new List<byte>(Math.Min(_maxFrameLength, 4096));
262 var temp = new byte[Math.Min(_maxFrameLength, 4096)];
263 var readBuffer = _readBuffers.GetValue(stream, _ => new FrameReadBuffer());
264
265 while (true)
266 {
267 if (TryConsumeBufferedBytes(readBuffer, frame, out var frameBytes))
268 {
269 return frameBytes;
270 }
271
272 var read = await stream.ReadAsync(
273 temp.AsMemory(0, temp.Length),
274 cancellationToken)
275 .ConfigureAwait(false);
276
277 if (read == 0)
278 {
279 return frame.Count == 0
280 ? null
281 : frame.ToArray();
282 }
283
284 lock (readBuffer.SyncRoot)
285 {
286 for (var index = 0; index < read; index++)
287 {
288 readBuffer.Pending.Enqueue(temp[index]);
289 }
290 }
291 }
292 }

다음을 참조함 : _maxFrameLength, _readBuffers, TryConsumeBufferedBytes().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ TryConsumeBufferedBytes()

bool Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.TryConsumeBufferedBytes ( FrameReadBuffer readBuffer,
List< byte > frame,
out byte?[] result )
inlineprivate

스트림별 대기 버퍼의 바이트를 소비해 완전한 구분자 프레임 생성을 시도합니다.

매개변수
readBuffer아직 처리하지 않은 바이트가 저장된 버퍼입니다.
frame현재 조립 중인 프레임 바이트입니다.
result완성된 경우 구분자를 제외한 프레임이며, 아니면 null입니다.
반환값
완전한 프레임을 만들었으면 true입니다.
예외
InvalidDataException프레임이 최대 허용 길이를 초과한 경우 발생합니다.

DelimiterMessageFrameCodec.cs 파일의 342 번째 라인에서 정의되었습니다.

346 {
347 result = null;
348
349 lock (readBuffer.SyncRoot)
350 {
351 while (readBuffer.Pending.Count > 0)
352 {
353 frame.Add(readBuffer.Pending.Dequeue());
354
355 if (frame.Count > _maxFrameLength)
356 {
357 throw new InvalidDataException(
358 $"Frame length exceeded. MaxFrameLength={_maxFrameLength}");
359 }
360
361 if (!EndsWithDelimiter(frame))
362 {
363 continue;
364 }
365
366 frame.RemoveRange(
367 frame.Count - _delimiter.Length,
368 _delimiter.Length);
369
370 result = frame.ToArray();
371 return true;
372 }
373 }
374
375 return false;
376 }

다음을 참조함 : _delimiter, _maxFrameLength, EndsWithDelimiter(), Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.FrameReadBuffer.Pending, Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.FrameReadBuffer.SyncRoot.

다음에 의해서 참조됨 : ReadFrameAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ WriteFrameAsync()

async Task Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec.WriteFrameAsync ( Stream stream,
byte[] payload,
CancellationToken cancellationToken = default )
inline

페이로드와 구분자를 차례로 스트림에 비동기 기록합니다.

매개변수
stream기록할 스트림입니다.
payload구분자 앞에 기록할 메시지 데이터입니다.
cancellationToken쓰기 취소 요청을 감시하는 토큰입니다.
반환값
비동기 프레임 쓰기 작업입니다.
예외
ArgumentNullException스트림 또는 페이로드가 null인 경우 발생합니다.
OperationCanceledException작업 취소가 요청된 경우 발생할 수 있습니다.

Dreamine.Communication.Core.Framing.IMessageFrameCodec를 구현.

DelimiterMessageFrameCodec.cs 파일의 186 번째 라인에서 정의되었습니다.

190 {
191 ArgumentNullException.ThrowIfNull(stream);
192 ArgumentNullException.ThrowIfNull(payload);
193
194 await stream.WriteAsync(payload, cancellationToken).ConfigureAwait(false);
195 await stream.WriteAsync(_delimiter, cancellationToken).ConfigureAwait(false);
196 await stream.FlushAsync(cancellationToken).ConfigureAwait(false);
197 }

다음을 참조함 : _delimiter.

멤버 데이터 문서화

◆ _delimiter

readonly byte [] Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec._delimiter
private

delimiter 값을 보관합니다.

DelimiterMessageFrameCodec.cs 파일의 24 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : DelimiterMessageFrameCodec(), EndsWithDelimiter(), TryConsumeBufferedBytes(), WriteFrameAsync().

◆ _maxFrameLength

readonly int Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec._maxFrameLength
private

max Frame Length 값을 보관합니다.

DelimiterMessageFrameCodec.cs 파일의 33 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : DelimiterMessageFrameCodec(), ReadFrameAsync(), TryConsumeBufferedBytes().

◆ _readBuffers

readonly ConditionalWeakTable<Stream, FrameReadBuffer> Dreamine.Communication.Core.Framing.DelimiterMessageFrameCodec._readBuffers = new()
private

read Buffers 값을 보관합니다.

DelimiterMessageFrameCodec.cs 파일의 42 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ReadFrameAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: