첫 번째 Netty 서버 및 클라이언트 구축

5280 단어

첫 번째 Netty 애플리케이션 구축


이 글은 간단한 Netty 서버와 클라이언트를 구축하는 방법을 기록합니다.
의존 환경:
  • Java 8
  • Netty4
  • 
        
            io.netty
            netty-all
            4.1.11.Final
        
    
    

    Echo 서버 작성


    모든 Netty 서버에는 다음 두 섹션이 필요합니다.
  • 최소한 하나의 ChannelHandler: 업무 논리를 처리하는 데 사용됩니다
  • 안내: 서버 시작 코드를 설정하여 연결 요청을 감청하는 포트에 서버를 연결합니다.

  • EchoServerHandler 클래스: 핵심 비즈니스 논리 처리
    @ChannelHandler.Sharable
    public class EchoServerHandler extends ChannelInboundHandlerAdapter{
    
        @Override
        public void channelRead(ChannelHandlerContext context, Object msg) {
            ByteBuf in = (ByteBuf) msg;
            System.out.println("server received: " + in.toString(CharsetUtil.UTF_8));
            context.write(in);
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
            ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext context, Throwable couse) {
            couse.printStackTrace();
            context.close();
        }
    }
    

    EchoServer 클래스: 서버를 구성하고 입국 메시지를 EchoServerHandler 인스턴스에 알립니다.
    public class EchoServer {
    
        private final int port;
    
        public EchoServer(int port) {
            this.port = port;
        }
    
        public static void main(String[] args) throws Exception {
            System.err.println("Usage: " + EchoServer.class.getSimpleName() + "");
            int port = 8999;
            new EchoServer(port).start();
        }
    
        public void start() throws Exception{
            final EchoServerHandler serverHandler = new EchoServerHandler();
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                ServerBootstrap b = new ServerBootstrap();
                b.group(group).channel(NioServerSocketChannel.class)
                 .localAddress(new InetSocketAddress(port)).childHandler(new ChannelInitializer() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline().addLast(serverHandler);
                    }
                });
                ChannelFuture future = b.bind().sync();
                future.channel().closeFuture().sync();
            } finally {
                group.shutdownGracefully().sync();
            }
        }
    }
    

    서버 주요 코드 구성 요소
  • EchoServerHandler는 비즈니스 논리를 실현합니다
  • main () 부트 서버

  • 부트 프로세스:
  • 서버를 안내하고 귀속시키기 위해 ServerBootstap 실례를 만듭니다
  • NioEventLoopGroup 실례를 만들고 분배하여 이벤트 처리를 한다. 예를 들어 새로운 연결과 읽기와 쓰기 데이터를 받아들인다
  • 서버가 바인딩된 로컬 InetSocketAddress를 지정합니다
  • Handler 인스턴스를 사용하여 새 Channel을 초기화합니다
  • ServerBootstap 호출.bind () 방법은 서버를 귀속합니다

  • Echo 클라이언트 작성


    Echo 클라이언트:
  • 서버에 연결합니다
  • 하나 이상의 메시지를 보냅니다
  • 모든 메시지에 대해 서버에서 보내는 같은 메시지를 기다리고 받습니다
  • 연결을 닫습니다

  • ChannelHandler 클래스: 클라이언트 논리 구현
  • channelActive () 와 서버를 연결한 후 호출합니다
  • channelRead()는 서버에서 정보를 받은 후 호출됩니다
  • exceptionCaught() 처리 과정에서 이상이 발생하면 호출됩니다
  • @ChannelHandler.Sharable
    public class EchoClientHandle extends SimpleChannelInboundHandler{
    
        @Override
        public void channelActive(ChannelHandlerContext context) {
            context.writeAndFlush(Unpooled.copiedBuffer("Netty rocks", CharsetUtil.UTF_8));
        }
    
        @Override
        protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
            System.out.println("Client received: " + byteBuf.toString(CharsetUtil.UTF_8));
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext context, Throwable cause) {
            cause.printStackTrace();
            context.close();
        }
    }
    

    EchoClient 클래스: 부트 클라이언트
    public class EchoClient {
    
        //  
        private final String host;
        private final int port;
    
        public EchoClient(String host, int port) {
            this.host = host;
            this.port = port;
        }
    
        public void start() throws Exception{
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(group)
                 .channel(NioSocketChannel.class)
                 .remoteAddress(new InetSocketAddress(host, port))
                 .handler(new ChannelInitializer() {
                     @Override
                     protected void initChannel(SocketChannel socketChannel) throws Exception {
                         socketChannel.pipeline().addLast(new EchoClientHandle());
                     }
                 });
                ChannelFuture future = b.connect().sync();
                future.channel().closeFuture().sync();
            } finally {
                group.shutdownGracefully().sync();
            }
        }
    
        public static void main(String[] args) throws Exception {
            new EchoClient("localhost", 8999).start();
        }
    }
    

    GitHub 주소:https://github.com/huangbuhuan/netty-demo

    참조 연결

  • 《Netty In Action》
  • 좋은 웹페이지 즐겨찾기