본문 바로가기
프로그래밍/Netty 기초

06. Discard Client 만들기

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

클라이언트를 만들다 보면 Netty가 정말 편한다는것을 알수 있다.

 

전체코드를 한번보고 서버와 다른점을 한번 더 보자 

DiscardClient.java

Server와 특별하게 다른점은 안보일것이다.

살짝 다른 부분만 보자. 아래 코드는 하나의 java에 클래스 두개 만들어서 사용했다

접속하자 마자 Say Hello... 만 보내주는 코드이다.

 

그 외 Handler가 동작하는 모습은 서버와 동일하다고 보면 된다. 

이벤트도 동일한 순서대로 일어나는것을 볼수 있다 

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.Level;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class DiscardClient {
    private static final Logger logger = LogManager.getLogger(DiscardServer.class.getName());

    public static void main(String[] args) throws Exception {

        Configurator.setLevel(DiscardServer.class.getName(), Level.ALL); // 로그설정

        EventLoopGroup group = new NioEventLoopGroup();

        try {
            Bootstrap b = new Bootstrap(); // 손님
            b.group(group);
            b.channel(NioSocketChannel.class); // 통신방식
            b.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline p = ch.pipeline();
                    p.addLast(new DiscardClientHandler());
                }
            });
            ChannelFuture f = b.connect("localhost", 8009).sync(); // 연결
            f.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully();
        }
    }
}

class DiscardClientHandler extends ChannelInboundHandlerAdapter {

    private static final Logger logger = LogManager.getLogger(DiscardClientHandler.class.getName());

    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        logger.info("channelActive...");
        ctx.writeAndFlush("Say Hello..");
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        logger.info("channelInactive...");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        logger.info("channelRead...");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        logger.info("exceptionCaught...{}", cause.getMessage());
        ctx.close();
    }
}

Bootstrap & EventLoop

서버코드는  EventLoopGroup 이 두개이고, client는 한개다

그리고 서버는 ServerBootstrap, 클라이언트는 Bootstrap을 사용한다 

// 서버코드 

	EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 편의점 출입구
	EventLoopGroup workerGroup = new NioEventLoopGroup(); // 편의점 내 카운터

	ServerBootstrap b = new ServerBootstrap(); // 편의점 가게
	b.group(bossGroup, workerGroup); // 가게안에 출입구 달고, 카운터를 배치

// 클라이언트 코드
	
	EventLoopGroup group = new NioEventLoopGroup();
    
	Bootstrap b = new Bootstrap(); // 손님
	b.group(group);

 

Listen & connect

서버에서는 bind 코드를,  클라이언트에서는 connect를 사용한다.

// 서버 코드 
	channelFuture f = b.bind(8009).sync(); // 문열고 기다림
    
// 클라이언트 코드
	ChannelFuture f = b.connect("localhost", 8009).sync(); // 연결

종료

앞에서 열었던 EventLoopGroup을 닫는거라, 열었던 것 만큼 닫는거라 보면 될것 같다.

// 서버코드
	workerGroup.shutdownGracefully(); // 우선 카운터 닫고
	bossGroup.shutdownGracefully(); // 편의점 닫고

// 클라이언트 코드
	group.shutdownGracefully();
728x90

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

04. ChannelHandler 란  (0) 2022.01.06
05. channeInboundAdapter 이벤트 순서  (0) 2022.01.06
03. Discard 서버로 기초를 만들어보자  (0) 2022.01.06
01. Netty란  (0) 2022.01.06
02. Discard 서버  (0) 2022.01.06