[Netwok/Netty]06. Netty 구축을 위한 beans(1) - ServerBootstrap
(출처 : http://javafactory.tistory.com/1382)
1. Beans
- public abstract class AbstractBootstrap<Generic........>
bootstrab의 사전적 의미는 한 번 시작하면 알아서 진행되는 일련의 과정을 말한다.
이 추상클래스는 헬퍼클래스로서 서버든 클라이언트든 이를 상속시켜주어 실제 소켓을 구현하게 도움을 준다.
특히 단어의 특성에 따라 method chaining이 가능하다.
기동을 하기위한 전체적인 일종의 틀 혹은 컨테이너.
- public class ServerBootStrap
extends AbstractBootstrap<ServerBootstrap, ServerChannel>
실제 서버를 구현하는 부트스트랩.
클라이언트의 연결을 수락하고 연결된 클라이언트 소켓에 대하여 입출력을 처리하는 두 개의 쓰레드 그룹을 관리한다.
하나의 쓰레드 그룹으로도 지정할 수는 있지만, 원활한 병행처리를 위하여 두 개의 그룹을 생성하기를 권장한다. - public class BootStrap extends AbstractBootstrap<Bootstrap, ServerChannel>
실제 클라이언트를 구현하는 부트스트랩. connect라는 method를 통해 해당 주소에 연결한다.
2. Methods
- public ServerBootstrap group
(EventLoopGroup parentGroup, EventLoopGroup, childGroup)
이벤트 루프 설정.
클라이언트의 연결을 수락하고 연결된 클라이언트 소켓에 대하여 입출력을 처리하는 두 개의 쓰레드 그룹을 관리한다.
하나의 쓰레드 그룹으로도 지정할 수는 있지만, 원활한 병행처리를 위하여 두 개의 그룹을 생성하기를 권장한다.
- public B channel(Class<? extends C> channelClass)
'해당 서버 부트스트랩에 지정할 채널에 대하여 어떤 방식으로 통신할 것인가'를 지정한다.
부모클래스의 AbstractBootstrap을 상속받고 있고 개발자가 원하는 채널을 지정할 수 있다.
지금은 nio만 할 것이므로 NioServerSocketChannel.class를 사용한다.
- public <T> B option(ChannelOption<T> option, T value)
AbstractBootstrap으로 부터 상속받았다.
상속받은 method들은(option, handler) 최초 서버 기동에 대한 초기설정에 불과하다.
최초 클라이언트로부터 연결에 대한, 서버 자신의 채널(혹은 소켓)옵션을 지정한다.
이 종류는 ChannelOption에서 확인이 가능하다.
참고로 매개변수 SO_BACKLOG, 100의 의미는
클라이언트로부터의 연결이 들어오는 큐에 대하여 몇 개까지 지정할 수 있는가를 말한다.
- public B handler(ChannelHandler handler)
본 method를 통해 해당 서버소켓(혹은 채널)에서 발생 되는 이벤트들을 담당한다.
LoggingHandler는 서버에서 발생되는 모든 이벤트들을 Log로 출력한다.
본 Bean을 들여다보면 ChannelInboundHandler를 상속받고 ChannelOutboundHandler를 구현받고 있다.
이 말인 즉슨 서버입장에서 당발, 타발에 대한 이벤트들을 Log로 출력한다는 의미로 볼 수 있다. - public ServerBootstrap childHander(ChannelHander handler)
ServerBootstrap에서 구현된 child method(childHandler, childOption)이다.
클라이언트로 부터 연결이 들어 올 때, 본 method를 통해서 해당 클라이언트와의 발생되는 이벤트들을 관리하게 된다.
매개변수는 ChannelInitializer를 작성함으로서, 새로 연결된 Channel과 환경설정을 지정해준다.
대부분 ChannelPipeline을 이용하여 handler들을 계속 추가한다.
실제 이벤트가 발생되면 어떤 동작을 취하는지는 본 method를 통해 작성할 수 있다. - public <T> ServerBootstrap childOption
(ChannelOption<T> childOption, T value)
클라이언트로 부터 연결이 온 후에 해당 소켓(혹은 채널)에 대한 옵션을 지정한다.
SO_KEEPALIVE의 의미는 해당 클라이언트와 연결한 세션에 대하여 종료여부를 감지하는 것을 말한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | public static void main(String[] args) { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try{ // 서버 부트스트랩 생성 ServerBootstrap b = new ServerBootstrap(); // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 서버 회선 설정 시작. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // 이벤트루프 설정 b.group(bossGroup, workerGroup) // 채널입출력방식 설정 .channel(NioServerSocketChannel.class) // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 서버부트스트랩의 초기화가 진행될때. 시작 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // 최초 클라이언트로부터의 연결이 들어오는 큐에 대하여 100개까지 지정. .option(ChannelOption.SO_BACKLOG, 100) // 이벤트 핸들러 설정 - 로그핸들러로 지정. .handler(new LoggingHandler(LogLevel.INFO)) // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 서버부트스트랩의 초기화가 진행될때. 끄읕 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 클라이언트로부터 연결이 완료된 후. 시작 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 새로 연결된 채널과 이벤트 핸들러 설정 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel paramC) throws Exception { paramC.pipeline().addLast(new ByteArrayDecoder()); paramC.pipeline().addLast(new EchoServerHandler()); paramC.pipeline().addLast(new ByteArrayEncoder()); } }) // 세션 해제 여부 감지. .childOption(ChannelOption.SO_KEEPALIVE, true); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 클라이언트로부터 연결이 완료된 후. 끄읕 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 서버 회선 설정 끄읕. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ChannelFuture f = b.bind(PORT).sync(); f.channel().closeFuture().sync(); }catch(Exception e){ e.printStackTrace(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } | cs |
반응형
'잔잔바리 > Netty' 카테고리의 다른 글
[Netwok/Netty]07. Netty 구축을 위한 beans(3) - ChannelPipleline (0) | 2017.10.22 |
---|---|
[Netwok/Netty]05. Netty 구축을 위한 beans(1) - Group (0) | 2017.10.20 |
[Netwok/Netty]04. 사전에 파악할 용어 (0) | 2017.10.19 |
[Netwok/Netty]03. ByteBuffer VS ByteBuf - ByteBuf (0) | 2017.10.14 |
[Netwok/Netty]02. ByteBuffer - ByteBuffer (0) | 2017.10.09 |