본문 바로가기
프로그래밍/Netty EchoServer 만들기

02. EchoServer 응답값 바꿔보기

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

여기서는 첫 손님이 들어왔을때 환영인사와 손님이 말할때 다시 말해주는 부분을 추가해 보려 한다

 

- 접속시 환영 메시지를 추가해보자

- Echo 응답 시 응답메시지를 바꿔서 보내보겠다.

 

ByteBuf로 전달되는 메시지를 Unpooled 함수를 사용해서 한번 조작해보자.

Unpooled 와 Pooled 두가지가 있는데, 성능상으로는 Pooled 가 더 좋다고 한다.

 

1.  문 열고 들어왔을때 환영 메시지 

고객이 문 열고 들어왔을때 아래 처럼 이벤트가 발생한다. 

여기서는 channelActive 함수에다가 추가를 해보겠다.

[main] INFO EchServer - 편의점 여는 중 ..
[main] INFO EchServer - 편의점 열었음 ..
[nioEventLoopGroup-3-1] INFO EchServer - 고객 들어옴 : initChannel..
[nioEventLoopGroup-3-1] INFO EchoServerHandler - DiscardServerHandler init..
[nioEventLoopGroup-3-1] INFO EchoServerHandler - channelActive..

 

전송시에는 ctx.channel().writeAndFlush 를 사용하면 된다.

여기서 Unpooled 와 Pooled 차이가 있다

 

Unpooled 는 매 순간마다 새로운 Buffer를 할당함으로 오버헤드가 발생한다고 되어있고,  Pooled 는 새로운 할당이나 사용후 반환 시 오버헤드를 감소 시킨다고 한다.

 

손님이 올때마다 새로운 직원을 배치 시키는것보다 여러명을 지정해놓고 노는 친구가 있으면 해당 친구가 응대하고, 만약 꽉 차 있으면 손님을 대기하게 하는게  더 나은 경우가 많을듯 하네

 

각각의 샘플을 한번 보자.

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        logger.info("channelActive..");

        String strWelcome = "welcome to my store!!\n";
        
        //Unpooled
        ctx.channel().writeAndFlush(Unpooled.wrappedBuffer(strWelcome.getBytes(CharsetUtil.UTF_8)));

        //Pooled
        ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(strWelcome.length()); // 길이만큼 할당
        buf.writeBytes(strWelcome.getBytes(CharsetUtil.UTF_8)); // 얻어온 ByteBuf에 값쓰기
        ctx.channel().writeAndFlush(buf);
    }

이렇게 하고 돌려보면 아래와 같다. 

[flowx@dev:~/doc/study/netty/EchoServer] telnet localhost 8009
Trying ::1... Connected to localhost. Escape character is '^]'.
welcome to my store!!

 

2. 다음은 손님에게 메시지를 보낼때 덧붙혀서 보내보자. 

앞에서 사용한 Unpooled.wrappedBuffer를 사용해서 보내보자 

보내는 메시지에 "Reply from server : " 만 앞에 붙혔다.

Unpooled와 Pooled 도 같이 해보자. 방법은 아래와 같다. 

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        String str = ((ByteBuf) msg).toString(CharsetUtil.UTF_8);

        String strReturn = "Reply from server : " + str;

        // Unpooled
        ByteBuf unpooledBuf = Unpooled.wrappedBuffer(strReturn.getBytes(CharsetUtil.UTF_8));
        ctx.channel().writeAndFlush(unpooledBuf);

        // Pooled
        ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(strReturn.length()); // 필요한 길이만큼 할당
        buf.writeBytes(strReturn.getBytes(CharsetUtil.UTF_8)); // 얻어온 ByteBuf에 쓰기
        logger.info("channelRead..{}", str);
    }

3. PooledByteBufAllocator.DEFAULT 값이 뭔지 보자 

위 내용을 보려면 디버깅을 해봐야 한다

 

1) 원하는 라인번호 왼쪽에(EchoServerHandlere.java) 마우스를 갖다대고 클릭하면 break point가 생긴다

2) 그리고 EchoServer.java를 Debug모드로 돌려보자 

3) 그리고 telnet으로 접속해보면 channelActive에 멈춘다 

4) 그리고 중간에 있는 화살표들 중 왼쪽기준 첫번째가 진행, 다음이 다음줄로, 다음이 함수 안쪽으로, 다음이 밖으로 이렇게 진행된다.

     그중 두번째꺼 눌러보자 

5) 그리고 vscode 하단에 DEBUG CONSOLE 탭 누르고 밑에 입력값에 PooledByteBufAllocator.DEFAULT 값 입력 하고 값을보면

     true로 되어 있다 

vscode debug 모드

이제 실행해보면 아래와 같이 나온다.

[flowx@dev:~/doc/study/netty/EchoServer] telnet localhost 8009
Trying ::1...
Connected to localhost.
Escape character is '^]'.
welcome to my store!!
hello netty
Reply from server : hello netty
728x90

'프로그래밍 > Netty EchoServer 만들기' 카테고리의 다른 글

01. Netty EchoServer 만들기  (0) 2022.01.06