get started with netty

Post on 18-Dec-2014

1.278 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

기본적인 netty사용법. netty.io get started 일부 번역

TRANSCRIPT

Get started with Nettybased on User guide for 4.X at Netty.io

CK. Kim

모든 패킷을 다 무시해버리는 서버를 만들어 보자.DISCARD Server

일단 서버가 연결된 뒤 패킷을 핸들링 하는 부분을 만들어보자

ChannelInboundHandlerAdapter는 ChannelInboundHandler.ChannelInboundHandler인터페이스의 구현체이다.

Adapter를 쓰는데 직접 ChannelInboundHandler를 모두 구현하는 것 보다 쉬울것이다.

channelRead를 상속받는다. channelRead 는 클라이언트로 부터 메시지를 맏을때마다 호출된다. 이 예제에서는 메시지를 ByteBuf로 캐스팅 하여 사용하였다.

무시하는 서버를 위해서는 모든 메시지에 대해 아무런 행동을 하지 않아도 된다. 하지만, 핸들러를 쓰면서 이것 하나는 꼭!!! 기억해야한다.

msg는 object reference를 풀어주기위해서 반드시 release를 해 줘야한다.

msg를 반드시 release하기 위해서 보통 다음과 같은 방법을 쓴다.

exceptionCaught는 IOException 같은 Throuwable Exception이 났을때 핸들링 하는 메서드이다. 이부분에서 에러를 로깅하고 체널을 닫을수 있도록 한다.

이제 Server를 생성하고 새로운 요청을 Listen/Connect하는 런쳐를 만들어보자

DiscardServer 는 port를 입력받아 생성하는 생성자와 실제 서버를 실행하는 run()메서드로 이루어져 있다.

NioEventLoopGroup는 multi-threaded event loop이다. event loop란것은 I/O작업을 받아들이는 역할을 한다.

NioEventLoopGroup은 EventLoopGroup의 구현체인데, EventLoopGroup은 전송방식에 따라 여러 구현체가 있는데 이 예제에서는 서버를 만들것이기 때문에 Nio를 사용한다.

EventGroup에는 크게 boss 와 worker 이 두가지 역할이 있다. boss는 들어오는 연결요청을 받아들이는 작업을 하고 worker는 연결된 요청을 처리하는 작업을 한다.

얼마나 많은 쓰레드를 만들것이나, 얼마나 많은 채널을 열것이냐는 EventGroup의 생성자를 통하여 설정할 수 있다.

ServerBootStrap이 커넥션이 맺어 져 새로운 Channel을 만들때에 NioServerSocketChannel을 생성할 수 있도록 지정해 준다.

ChannelInitializer는 새롭게 만들어지는 채널을 개발자가 설정할 수 있도록 해주는 아주 특별한 핸들러이다. 보통은 pipeline에 채널핸들러를 추가해 주기 위해 사용하는데, 이 예제에서는 전에 만든 DiscardServerHandler를 추가해 준다.

채널에다 옵션을 추가할 수 있다. 위 코드는 Backlog를 128로 지정하는 옵션이다.

ChannelOption를 참조하면 더 많은 옵션을 확인 할 수 있다.

설정에는 option()과 childOption()두가지가 있다. option은 외부의 요청을 받는 채널을 위한 옵션이고,

childOption은 커넥션이 맺어진 후 생성되는 자식 채널의 위한 옵션이다. 위 코드에서는 그렇게 생성된 채널에 KeepAlive속성을 주고 있다.

이제 서버를 실행 시킬 모든 준비가 끝났다. bind를 통하여 특정 포트에 할당 할 수 있다.

포트만 다르다면, 몇번이고 같은 서버를 실행 할 수 있다.

등짝.. 아니, 메시지 내용을 보자!!

InboundHandler의 channelRead에서 인자로 주어지는 msg를 ByteBuf로 캐스팅하여 사용하면 된다.

추가적으로 해당 체널에 다시 메시지를 보내고 싶다면, ChannelHandlerContext의 write()를 이용하면 된다. 위의 코드는 Eco Server의 channelRead이다.

top related