単純なHTTPリクエストを開始するネッティーサーバが処理することができます。
前の手順に従ってネッティー書かを使用します。コードを貼り付けます。
サーバ
1 インポートio.netty.bootstrap.ServerBootstrap; 2 インポートio.netty.channel.ChannelFuture; 3 インポートio.netty.channel.EventLoopGroup; 4 インポートio.netty.channel.nio.NioEventLoopGroup; 5 インポートio.netty.channel。 socket.nio.NioServerSocketChannel; 6。 7。 / ** 8。 * @ClassName:TestServe 9。 * @description:主な役割が説明されたが、疑似サーバを書くにHTTPリクエストをサポートしています。リクエストヘッダを参照することができ、データはまた、自身の応答を構築することができる 10 * @CreateDate:23時08 2019年7月3日 11 * @Versionを:1.0 12である * / 13はある 公共の クラス{TESTSERVER 14 15 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 16 EventLoopGroup bossGroup = 新しい新しい NioEventLoopGroupを(); // 無限ループのセットを受信するためのスレッド・イベント・ループ 17 EventLoopGroup workerGroup = 新しい新しい NioEventLoopGroup(); // スレッド処理するためのイベントループ無限ループグループ 18である 。19 試み{ 20は // スタータ 21は = ServerBootstrap ServerBootstrapの新しい新ServerBootstrap()は、 22である serverBootstrap.group(bossGroup、workerGroup)//追加の二つはスレッドグループ設けられ 23である .Channel(NioServerSocketChannel。クラス) 24 .childHandler(新しい新しい TestSereverInitlalizer()); // これは、クラスを初期化するために提供される 25 26である ChannelFuture ChannelFuture = serverBootstrap.bind(8899).syncを(); // ブロックし待機 27 28 ..; channelFuture.channel()closeFuture()同期() 29 } 最後に{ 30 bossGroup.shutdownGracefullyを(); //閉じるエレガント 31は workerGroup.shutdownGracefully(); 32 } 33で 34れています } 35 }
Initlalizer
1つの インポートio.netty.channel.ChannelInitializer。 2 インポートio.netty.channel.ChannelPipeline。 3 輸入io.netty.channel.socket.SocketChannel。 4 インポートio.netty.handler.codec.http.HttpServerCodec。 5 6 パブリック クラス TestSereverInitlalizerは延び ChannelInitializer <たSocketChannel> { 7 8 @Override 9 保護 ボイド initChannel(のSocketChannel CH)がスロー例外{ 10 ChannelPipelineパイプライン= )(ch.pipelineします。 11 12 pipeline.addLast( "httpServerCodec"、新たな新 HttpServerCodec()); // で使用されるHTTP 13は pipeline.addLast( "testHttpSereverHandle"、新たな新 TestHttpServerHandler()); // 予め設定ハンドラは、最後に追加 14 15 } 16 }
ハンドラ
1つの インポートio.netty.buffer.ByteBuf。 2 インポートio.netty.buffer.Unpooled。 3 インポートio.netty.channel.ChannelHandlerContext。 4 インポートio.netty.channel.SimpleChannelInboundHandler。 5 輸入 io.netty.handler.codec.http *。; 6 インポートio.netty.util.CharsetUtil。 7 8 インポートjava.net.URI。 9つの インポートのjava.net.URL。 10の 11 パブリック クラス TestHttpServerHandlerは延び SimpleChannelInboundHandler <HttpObject> { 12 13 @Override 14は 保護 ボイド channelRead0(ChannelHandlerContext CTX、HttpObject MSG)をスロー例外{ 15 16 のSystem.out.println(msg.getClass()); 17 18である ([リモートのctx.channel()())のSystem.out.println。 19 20 のIF(MSG のinstanceofのHttpRequest){ // これを追加しない場合はカールを使用してアクセスする場合、与えられたアクセスブラウザは文句はありません 21 // するSystem.out.printlnを( "行っ!!!!!") 、 22である 23である のHttpRequestのHttpRequest = (HttpRequestの)MSG; 24 25 のSystem.out.println( "リクエストメソッド名" +。httpRequest.getMethod()名()); 26である 27 URI URI = 新しい新しいURI(httpRequest.uri()); 28 IF( "/favicon.ico" .equals(uri.getPath())){ 29 のSystem.out .println( "リクエストfavicon.icoを" ); 30 リターン; 31である } 32 33であるが 、// クライアントにコンテンツを返さ 34で ByteBuf Unpooled.copiedBuffer含量=( "Hello World"の;、CharsetUtil.UTF_8) 35 // 建設応答 36 レスポンス= FullHttpResponse 新新DefaultFullHttpResponse(HttpVersion.HTTP_1_1、HttpResponseStatus.OK、コンテンツ)。 37 response.headers()セット(HttpHeaderNames.CONTENT_TYPE、 "text / plainで"。 )。 38 。response.headers()セット(HttpHeaderNames.CONTENT_LENGTH、content.readableBytes())。 39 40 ctx.writeAndFlush(応答)。 41 ctx.channel()クローズ()。 42 } 43 44 } 45 46 @Override 47 公共 ボイド channelActive(ChannelHandlerContext CTX)がスロー例外{ 48 のSystem.out.printlnは( "アクティブチャネル"); 49 スーパー.channelActive(CTX); 50 } 51 52 @Override 53 公共 ボイド channelInactive(ChannelHandlerContext CTX)がスロー例外{ 54 のSystem.out.println( "チャネル非アクティブ" )。 55 スーパー.channelInactive(CTX); 56 } 57 58 @Override 59 公共 ボイド channelRegistered(ChannelHandlerContext CTX)がスロー例外{ 60 のSystem.out.println( "登録チャネル" )。 61人の スーパー.channelRegistered(CTX)。 62 } 63 64 @Override 65 公共 ボイド channelUnregistered(ChannelHandlerContext CTX)がスロー例外{ 66 のSystem.out.println( "未登録のチャンネル" )。 67 スーパーは(CTX)を.channelUnregistered。 68 } 69 70 @Override 71 公共 ボイド handlerAdded(ChannelHandlerContext CTX)がスロー例外{ 72 のSystem.out.println( "ハンドラが追加の" )。 73 スーパー(CTX)を.handlerAdded。 74 } 75 }