자바 TCP/IP 통신 (Netty, 네티) - 3 송신
항상 늘 그랬듯이 아무것도 모를 미래의 나에게 설명한다.
이전 글에서 사용했던
부트스트랩을 연결할 때 핸들러를 등록할때 사용했던 ChannelInitializer클래스를 이용해 설명할 수 있다.
clientBootstrap.group(e)
.option(ChannelOption.AUTO_READ, true)
.handler(new ChannelInitializer());
ChannelInitializer클래스는 ChannelInitializer<Channel> 을 상속받았는데
( import io.netty.channel.ChannelInitializer )
ChannelInitializer안의
initChannel 메소드를 오버라이딩하여 아래와 같이 정의되었다.
@Override
protected void initChannel(Channel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast("Decoder", new Decoder());
pipeline.addLast("Encoder", new Encoder());
}
메소드는 채널객체를 받아 채널안의 파이프라인에 인코더와 디코더를 추가해주고
송신시 ChannelOutboundHandlerAdapter클래스를 상속받은 클래스의 encode() 메소드를 통해서 메시지를 송신할 수 있다.
encode() 메소드의 사용방법은 아래의 형식과 같다.
@Override
protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception {
int Length = 보낼 메시지를 바이트배열로 변환했을때의 길이;
//(바이트배열로 변환 가능해야함)
보낼메시지= (보낼메시지) msg;
out = ctx.alloc().buffer(Length);
out.writeBytes( << 설명 : 보낼 메시지를 바이트 배열 변환한다 >> );
// 전송시 메소드
ctx.writeAndFlush(out);
}
일일이 타이핑 하기 너무 길다.
ChannelHandlerContext -> ctx
ctx를 이용하여 메시지를 상대방에게 전송하기전 보낼 메시지의 길이만큼 ByteBuf 에 할당해준뒤
ByteBuf객체에 그 만큼의 메시지 내용을 싣는것을 확인 할 수 있다.
그뒤 ctx의 메소드를 사용하여 ByteBuf 객체를 전송한다.
우리가 ctx.writeAndFlush( ByteBuf out ) 이 어떻게 동작하는지 몰라도
결국에 보낼때 사용하는 것은 ctx객체의 writeAndFlush(Object obj) 라는것을 알 수 있다.
이렇게 해서 간단하게 Netty를 이용하여 송신에 대한 설명을 종료할 수 있겠다.