본문 바로가기
프로그래밍/EmbeddedChannel 이란?

EmbeddedChannel 활용 (LineBasedFrameDecoder 테스트)

by Flow.X 2022. 1. 10.
728x90

LineBasedFrameDecoder 살펴보자

받은 bytebuf 데이터를 line endings , "\n","\r\n" 을 분리해준다고 한다.

밑에는 주루룩 읽어보면 될듯~

LineBasedFrameDecoder 설명

자 그럼 앞에 있었던 코드를 바꿔보자 

아래 내용으로 바꾸면 기대하는 건  channelRead 시에  안녕반가워 -> 두번째 반가워 -> 세번째 반가워 가 순서대로 도착할것같다

ByteBuf buf = Unpooled.buffer();

buf.writeBytes("안녕 반가워\n\n".getBytes()); // 변경 전

buf.writeBytes("안녕 반가워\n두번째 반가워\n세번째 반가워\n".getBytes()); // 변경 후

LoggingHandler에 byte형태로 수신된 첫번째 단락으로 보면 

"\n" 은 0a 로 표시된다. 그럼 총 3개가 있으니 다 수신된거다.

 

 "channelRead.. 안녕 반가워" 가 첫번째이고  EchoServerHandler.java에서 바로 ">> " 를 붙여서 리턴한다.

이런게 두개 더 있다.. 

 

실제로는 3개를 동시에 보낸다 하더라도 EchoServerHandler.java에는 3개 뭉텡이가 하나씩 전달 된다. 

EmbeddedChannel LineBasedFrameDecoder 결과

다음 readOutbound를 읽으면  channelRead 이벤트에서  ctx.channel().writeAndFlush 된 ">> 안녕 반가워"를 읽을수 있다.

ByteBuf readBuff = channel.readOutbound(); // 손님 나온다 
logger.info("readBuff={}",((ByteBuf)readBuff).toString(CharsetUtil.UTF_8));

그럼 두번 더 읽어보자

ByteBuf readBuff1 = channel.readOutbound(); // 손님 나온다 
logger.info("readBuff1={}",((ByteBuf)readBuff1).toString(CharsetUtil.UTF_8)); 

ByteBuf readBuff2 = channel.readOutbound(); // 손님 나온다 
logger.info("readBuff2={}",((ByteBuf)readBuff2).toString(CharsetUtil.UTF_8)); 

ByteBuf readBuff3 = channel.readOutbound(); // 손님 나온다 
logger.info("readBuff3={}",((ByteBuf)readBuff3).toString(CharsetUtil.UTF_8));

READ COMPLETE 가 떨어지고 각각 아래처럼 읽을수가 있다,

INFO  [main] io.netty.handler.logging.LoggingHandler - [id: 0xembedded, L:embedded - R:embedded] READ COMPLETE
INFO  [main] EmbededExampleTest - readBuff1=>> 안녕 반가워
INFO  [main] EmbededExampleTest - readBuff2=>> 두번째 반가워
INFO  [main] EmbededExampleTest - readBuff3=>> 세번째 반가워
728x90