본문 바로가기
프로그래밍/Netty Encoder & Decoder

Netty Encoder with VSCode

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

2022.01.06 - [프로그래밍/Netty Encoder & Decoder] - Netty Decoder with VS Code

전 장에서 말했던 Decoder는 받아서 처리하는 것이고, Encoder는 받은 처리결과를 되돌려 주는것이라고 보면 된다.

 

여기에 보면 Encoder는 두개가 있다

 

MessageToByteEncoder

내가 만든 메시지를 Byte로 변환한다.

Integer로 메시지 받아서 ByteBuf로 되돌려 준다.

public class IntegerEncoder extends MessageToByteEncoder<Integer> {
    @Override
    public void encode(ChannelHandlerContext ctx, Integer msg, ByteBuf out) throws Exception {
         out.writeInt(msg);
    }
}

 

MessageToMessageEncoder

이건 메시지를 메시지로 다시 바꿔서 전송한다.


한가지 주의할 점이 여기서 참조한 type이 RefereceCounted를 증가시키는 것이라면, 

ReferenceCounted.release()를 항상 호출함으로 ReferenceCounted.retain()을 반드시 호출해줘야하만 한다.

이건 나중에 예제코드로 한번 해보자. ( 한글인데 한글같지 않다 )

 

이건 Integer로 받아서 String으로 리턴한다.  

리턴값만 MessageToByteEncoder와 다르다.

 public class IntegerToStringEncoder extends MessageToMessageEncoder<Integer> {
     @Override
     public void encode(ChannelHandlerContext ctx, Integer message, List<Object> out) throws Exception {
         out.add(message.toString());
     }
 }

 

아래 예제를 보면 흐름이 이렇다

byte로 받아서 Decoder에 전달 ▶ channelHandler로 처리 ▶ Encoder 전달해서 byte로 바꿈 ▶ LoggingHandler로 전달
channel.pipeline().addLast(new LineBasedFrameDecoder(80)); // 엔터(\n)키로 단락 분리하고 80byte가 최대 임

channel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8)); // ByteBuf -> 문자열로 변경
channel.pipeline().addLast(new EchoServerHanlder()); // channelRead에 전달

channel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8)); // ByteBuf -> 문자열로 변경

StringEncoder를 보자

우선 MessageToMessageEncoder에서 상속받아 구현되어 있고, <CharSequence>를 파라미터로 받는다
함수내부는 간단하다.


생성자에서 charset을 받아서 encode 함수에서  ByteBufUtil.encodeString으로 ByteBuf로 변환한다.

public class StringEncoder extends MessageToMessageEncoder<CharSequence> {

    private final Charset charset;

    /**
     * Creates a new instance with the current system character set.
     */
    public StringEncoder() {
        this(Charset.defaultCharset());
    }

    /**
     * Creates a new instance with the specified character set.
     */
    public StringEncoder(Charset charset) {
        this.charset = ObjectUtil.checkNotNull(charset, "charset");
    }

    @Override
    protected void encode(ChannelHandlerContext ctx, CharSequence msg, List<Object> out) throws Exception {
        if (msg.length() == 0) {
            return;
        }

        out.add(ByteBufUtil.encodeString(ctx.alloc(), CharBuffer.wrap(msg), charset));
    }
}
728x90

'프로그래밍 > Netty Encoder & Decoder' 카테고리의 다른 글

Netty Encoder with VSCode (1)  (0) 2022.01.10
Netty Encoder & Decoder  (0) 2022.01.10
Netty Decoder with VSCode (2)  (0) 2022.01.07
Netty Decoder with VS Code (1)  (0) 2022.01.06