거꾸로 바라본 세상
반응형

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


반응형
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!