Netty実装Server Socket

3826 ワード

Netty実装Server Socket
Nettyは、NIO(Nonblocking I/O、非ブロックIO)に基づいて開発されたネットワーク通信フレームワークであり、BIO(Blocking I/O、ブロックIO)に比べて、彼の同時性能が大幅に向上した.NIO、同期非ブロックIO、トラフィック処理をブロックするがデータ受信をブロックしない、高同時かつ簡単なシーンを処理するのに適している.
関連概念:
Channel
データ転送ストリームは、channelに関する概念が以下の4つあり、前の図ではnettyの中のChannelを理解しています.
  • チャネルは、接続を表し、各要求がチャネルであることを理解することができる.
  • ChannelHandler、コア処理トラフィックはここで、トラフィック要求を処理するために使用される.
  • ChannelHandlerContextは、トラフィックデータを転送するために使用される.
  • ChannelPipelineは、処理に必要なChannelHandlerおよびChannelHandlerContextを保存するために使用される.

  • ByteBuf
    ByteBufはバイトを格納するコンテナで、バイト全体のキャッシュを読み書きしやすく、get/setもサポートしています.
  • Heap Bufferスタックバッファ、スタックバッファはByteBufで最もよく使われるモードで、彼はデータをスタック空間に格納します.
  • DirectBuffer直接バッファ、彼のメモリ割り当てはスタックで発生しませんjdk 1.4導入されたnioのByteBufferクラスは、jvmがローカルメソッドを介して割り当てメモリ
  • を呼び出すことを可能にする.
  • Composite Buffer複合バッファは、nettyが提供する複数の異なるByteBufのビューに相当し、jdkはこのような機能を提供しない.

  • Codec
    Nettyのエンコーディング/デコーダ、HttpRequestDecoderおよびHttpResponseEncoder、カスタムデコーダ
    サーバソケットをnettyで実装するには、次の手順に従います.
    1.環境:ideal springboot
    pom.xmlに依存を追加するには:
    
       io.netty
       netty-all
       5.0.0.Alpha2
    
    

    2.Serverエンドコード:
    public class EchoServer {
        private final Integer tcpServerPort;
    
        public EchoServer(Integer tcpServerPort) {
            this.tcpServerPort = tcpServerPort;
        }
    
        public void start() throws InterruptedException {
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                ServerBootstrap bootstrap = new ServerBootstrap();
                bootstrap.group(group)
                        .channel(NioServerSocketChannel.class)
                        .option(ChannelOption.SO_KEEPALIVE, true)
                        .localAddress(new InetSocketAddress(tcpServerPort))
                        .childHandler(new ChannelInitializer() {
                            @Override
                            protected void initChannel(SocketChannel socketChannel) throws
                            Exception {
                                socketChannel.pipeline().addLast(
                                		// 
                                        new ReadTimeoutHandler(30),
                                        // 
                                        new WriteTimeoutHandler(30),
                                        // Handler
                                        new EchoServerHandler()
                                        );
                            }
                        });
                ChannelFuture future = bootstrap.bind().sync();
                future.channel().closeFuture().sync();
            } finally {
                group.shutdownGracefully().sync();
            }
        }
        
        public static void main(String[] args) {
            EchoServer tcpserver = new EchoServer(6788);
    		try {
    			tcpserver.start();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
        }
    }
    

    Handerコード:
    主にいくつかのインタフェース関数を実現します
    //  Handler Handler 。
    @ChannelHandler.Sharable 
    public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelActive(final ChannelHandlerContext ctx)throws Exception{
    		// , 
        }
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            ByteBuf in = (ByteBuf) msg;
            System.out.println("Server received:" + in.toString(CharsetUtil.UTF_8)); 
            // 
            ctx.writeAndFlush(msg);
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws
        Exception {
            cause.printStackTrace();
            ctx.close();
        }
    
    }