기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

[Java] Netty Client
프로토콜/Netty

[Java] Netty Client

2020. 9. 7. 14:52
반응형

Netty Client

 

 

1. Maven Depedency 추가

<dependencies>
		<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-all</artifactId>
			<version>4.1.16.Final</version>
		</dependency>
	</dependencies>

 

Netty 라이브러리를 이용하기 위한 디펜던시를 추가합니다.

 

 

 

 

2. Client

Netty Client를 구성하기 위해 3가지 기초 설정이 필요합니다.

EventLoopGroup 생성과 Bootstrap 생성 및 구성, ChannelInitializer 생성입니다.

Netty Server를 구성하기 위한 설정과 많이 비슷합니다.

 

public NettyClient() throws InterruptedException {
		EventLoopGroup group = new NioEventLoopGroup();
		try {
			Bootstrap clientBootstrap = new Bootstrap();

			clientBootstrap.group(group);
			clientBootstrap.channel(NioSocketChannel.class);
			clientBootstrap.remoteAddress(new InetSocketAddress("localhost", 9999));
			clientBootstrap.handler(new ChannelInitializer<SocketChannel>() {
				protected void initChannel(SocketChannel socketChannel) throws Exception {
					socketChannel.pipeline().addLast(new ClientHandler());
				}
			});
			ChannelFuture channelFuture = clientBootstrap.connect().sync();
			channelFuture.channel().closeFuture().sync();
		} finally {
			group.shutdownGracefully().sync();
		}
	}

 

EventLoopGroup 생성

Netty TCP 서버를 만드는 첫 번째 단계로, EventLoopGroup을 생성해야합니다.

Netty는 Java NIO 를 사용하므로 NioEventLoopGroup이 생성됩니다.

 

 

BootStrap 만들기

클라이언트가 서버와 다른 점은 ServerBootstrap이 아닌 Bootstrap을 사용한다는 점입니다.

Bootstrap을 생성하고, EventLoopGroup과 NioSocketChannel 클래스를 연결해줍니다.

그 후 연결할 서버의 주소와 포트번호를 InetSocketAddress로 구성해줍니다.

 

ChannelInitializer 생성

위에서 설정한 Bootstrap에 ChannelInitializer()를 생성해서 추상화된 initChannel()를 Override해줍니다. 그리고, Override된 Handler에 데이터가 수신될 때마다 SocketChannel이 호출 됩니다.

여기서는 ClientHandler()를 생성해서 연결해주었습니다.

마지막으로 ChannelFuture 인스턴스를 생성해서 Bootstrap이 원격 서버에 연결하도록 설정하고 연결 될 때까지 대기하며, closeFuture()는 클라이언트가 종료될 때 까지 기다리는 메소드입니다.

 

 

 

3. ClientHandler

public class ClientHandler extends SimpleChannelInboundHandler {

    @Override
    public void channelActive(ChannelHandlerContext channelHandlerContext){
        channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("Netty Rocks!", CharsetUtil.UTF_8));
    }

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Client received: " + ((ByteBuf) msg).toString(CharsetUtil.UTF_8));
	}

    @Override
    public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable cause){
        cause.printStackTrace();
        channelHandlerContext.close();
    }
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
      ctx.close();
    }
}

 

ClientHandler는 실제로 원격 서버와 연결이 될 때 사용될 기능을 정의합니다.

 

 

 

 

4. 실행 결과

 

 

 

서버 측과 클라이언트 측의 핸들러를 잘 살펴보면 대화 내용이 어떻게 구성이 되어있는지 이해하기 편합니다.

 

1. Client 측에서 서버측으로 Netty Rocks라고 메시지를 보냈습니다.

2. 서버측에서는 클라이언트에서 받은 메시지 그대로 출력하며, return하는 값을 Hello + received로 보내주었습니다.

3. 클라이언트는 서버에서 리턴받은 메시지를 출력하는데, Hello 문자열이 추가된 값을 리턴 받은 것을 확인할 수 있습니다.

 

 

 

반응형
저작자표시 변경금지 (새창열림)

'프로토콜 > Netty' 카테고리의 다른 글

[Java] Netty Server  (0) 2020.09.04
Netty 파이프라인  (0) 2020.09.04
Netty란?  (0) 2020.09.01
    '프로토콜/Netty' 카테고리의 다른 글
    • [Java] Netty Server
    • Netty 파이프라인
    • Netty란?
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바