1. 네티의 ServerBootstrap 소켓모드
- ServerBootstrap은 논 블로킹 소켓, 블로킹 소켓, Epoll 소켓 이 있다.
1. Non Blocking Socket Mode
EventLoopGroup에서 새로운 객체를 생성할 때 NioEventLoopGroup 객체를 생성한다.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
그리고 채널에서 NioServerSocketChannel.class을 설정해주면 끝.
bootstrap.channel(NioServerSocketChannel.class);
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 51 | import io.netty.bootstrap.ServerBootstrap; 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.NioServerSocketChannel; //논 블로킹 입출력 모드를 지원하는 ServerBootstrap public class NonBlockServerBootStrap { public static void main(String[] args) { //bossGroup 클라이언트의 연결을 수락하는 부모 스레드 그룹 //NioEventLoopGroup(인수) 스레드 그룹 내에서 생성할 최대 스레드 수 1이므로 단일 스레드 EventLoopGroup bossGroup = new NioEventLoopGroup(1); //연결된 클라이언트 소켓으로부터 데이터 입출력(I/O) 및 이벤트처리를 담당하는 자식 쓰레드 그룹 //생성자에 인수가 없으므로 CPU 코어 수에 따른 쓰레드의 수가 설정된다. EventLoopGroup workerGroup = new NioEventLoopGroup(); try { //부트 스트랩 객체 생성 ServerBootstrap bootstrap = new ServerBootstrap(); //스레드 그룹 초기화 bootstrap.group(bossGroup,workerGroup); //채널 초기화 bootstrap.channel(NioServerSocketChannel.class); //자식 채널의 초기화 bootstrap.childHandler(new ChannelInitializer<SocketChannel>() { //클라이언트로부터 연결된 채널이 초기화 될때의 기본동작이 지정된 추상 클래스 @Override protected void initChannel(SocketChannel ch) throws Exception { //채널 파이프라인의 객체 생성 ChannelPipeline pipe = ch.pipeline(); //채널 파이프라인에 EchoServerHandler 클래스를 동록하여 클라이언트와 //연결이 되었을 때 데이터 처리를 담당한다. pipe.addLast(new EchoServerHandler()); } }); } catch (Exception e) { // TODO: handle exception } finally{ workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } } | cs |
2. Blocking Socket Mode
EventLoopGroup에서 새로운 객체를 생성할 때 OioEventLoopGroup객체를 생성한다.
EventLoopGroup bossGroup = new OioEventLoopGroup(1);
EventLoopGroup workerGroup = new OioEventLoopGroup();
그리고 채널에서 OioServerSocketChannel.class을 설정해주면 끝.
bootstrap.channel(OioServerSocketChannel.class);
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 | import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.oio.OioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.oio.OioServerSocketChannel; public class BlockingServerBootStrap { public static void main(String[] args) { //블로킹 모드 EventLoopGroup bossGroup = new OioEventLoopGroup(1); EventLoopGroup workerGroup = new OioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup); bootstrap.channel(OioServerSocketChannel.class); bootstrap.childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new EchoServerHandler()); } }); } catch (Exception e) { // TODO: handle exception } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } } | cs |
3 Epoll Socket Mode
-Epoll은 리눅스에서만 가능한다.
EventLoopGroup에서 새로운 객체를 생성할 때 NioEventLoopGroup 객체를 생성한다.
EventLoopGroup bossGroup = new EpollEventLoopGroup(1);
EventLoopGroup workerGroup = new EpollEventLoopGroup();
그리고 채널에서 EpollServerSocketChannel.class을 설정해주면 끝.
bootstrap.channel(EpollServerSocketChannel.class);
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 | import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.epoll.EpollEventLoopGroup; import io.netty.channel.epoll.EpollServerSocketChannel; import io.netty.channel.socket.SocketChannel; public class EpollEchoServerBootStrap { public static void main(String[] args) { //Epoll 입출력 모드 Epoll은 리눅스 운영체제에서만 동작한다. //Caused by: java.lang.IllegalStateException: Only supported on Linux EventLoopGroup bossGroup = new EpollEventLoopGroup(1); EventLoopGroup workerGroup = new EpollEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup); bootstrap.channel(EpollServerSocketChannel.class); bootstrap.childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new EchoServerHandler()); } }); } catch (Exception e) { // TODO: handle exception } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } } | cs |
'Back-End > Netty' 카테고리의 다른 글
[Netty]네티서버에 필요한 요소 (0) | 2017.04.14 |
---|---|
[Netty] @Sharable (0) | 2017.04.13 |
[Netty] 1. 네티 프레임워크 (0) | 2017.04.13 |
[Netty] Netty에서 Object객체 전송 및 ByteBuf로 변환하여 전송하기 (0) | 2016.06.01 |