Netty Client
1. Maven Depedency 추가
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.16.Final</version>
</dependency>
</dependencies>
Netty 라이브러리를 이용하기 위한 디펜던시를 추가합니다.
2. Client
Netty Client를 구성하기 위해 3가지 기초 설정이 필요합니다.
EventLoopGroup 생성과 Bootstrap 생성 및 구성, ChannelInitializer 생성입니다.
Netty Server를 구성하기 위한 설정과 많이 비슷합니다.
public NettyClient() throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap clientBootstrap = new Bootstrap();
clientBootstrap.group(group);
clientBootstrap.channel(NioSocketChannel.class);
clientBootstrap.remoteAddress(new InetSocketAddress("localhost", 9999));
clientBootstrap.handler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new ClientHandler());
}
});
ChannelFuture channelFuture = clientBootstrap.connect().sync();
channelFuture.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
EventLoopGroup 생성
Netty TCP 서버를 만드는 첫 번째 단계로, EventLoopGroup을 생성해야합니다.
Netty는 Java NIO 를 사용하므로 NioEventLoopGroup이 생성됩니다.
BootStrap 만들기
클라이언트가 서버와 다른 점은 ServerBootstrap이 아닌 Bootstrap을 사용한다는 점입니다.
Bootstrap을 생성하고, EventLoopGroup과 NioSocketChannel 클래스를 연결해줍니다.
그 후 연결할 서버의 주소와 포트번호를 InetSocketAddress로 구성해줍니다.
ChannelInitializer 생성
위에서 설정한 Bootstrap에 ChannelInitializer()를 생성해서 추상화된 initChannel()를 Override해줍니다. 그리고, Override된 Handler에 데이터가 수신될 때마다 SocketChannel이 호출 됩니다.
여기서는 ClientHandler()를 생성해서 연결해주었습니다.
마지막으로 ChannelFuture 인스턴스를 생성해서 Bootstrap이 원격 서버에 연결하도록 설정하고 연결 될 때까지 대기하며, closeFuture()는 클라이언트가 종료될 때 까지 기다리는 메소드입니다.
3. ClientHandler
public class ClientHandler extends SimpleChannelInboundHandler {
@Override
public void channelActive(ChannelHandlerContext channelHandlerContext){
channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("Netty Rocks!", CharsetUtil.UTF_8));
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
System.out.println("Client received: " + ((ByteBuf) msg).toString(CharsetUtil.UTF_8));
}
@Override
public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable cause){
cause.printStackTrace();
channelHandlerContext.close();
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.close();
}
}
ClientHandler는 실제로 원격 서버와 연결이 될 때 사용될 기능을 정의합니다.
4. 실행 결과
서버 측과 클라이언트 측의 핸들러를 잘 살펴보면 대화 내용이 어떻게 구성이 되어있는지 이해하기 편합니다.
1. Client 측에서 서버측으로 Netty Rocks라고 메시지를 보냈습니다.
2. 서버측에서는 클라이언트에서 받은 메시지 그대로 출력하며, return하는 값을 Hello + received로 보내주었습니다.
3. 클라이언트는 서버에서 리턴받은 메시지를 출력하는데, Hello 문자열이 추가된 값을 리턴 받은 것을 확인할 수 있습니다.
'프로토콜 > Netty' 카테고리의 다른 글
[Java] Netty Server (0) | 2020.09.04 |
---|---|
Netty 파이프라인 (0) | 2020.09.04 |
Netty란? (0) | 2020.09.01 |