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 |