日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 )

發布時間:2025/6/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、 HTTP 服務器請求過濾功能
    • 1 . HTTP 服務器資源請求過濾
    • 2 . HTTP 請求過濾方法
  • 二、 HTTP 服務器 ( 資源過濾 ) 代碼實現
    • 1 . 服務器主程序
    • 2 . 服務器業務邏輯處理類
    • 3 . 執行結果





一、 HTTP 服務器請求過濾功能



1 . HTTP 服務器資源請求過濾


在上述代碼案例中 , 運行后 , 服務器端收到了兩次 HTTP 請求 , 這里的兩次請求 , 一個是請求 http://127.0.0.1:8888/ 地址資源 , 令一個是請求網站的圖標 ;

顯然我們只關心請求的 http://127.0.0.1:8888/ 地址資源 , 不關心網站圖標 ;

服務器端需要屏蔽第二次對圖標資源的請求 ;



2 . HTTP 請求過濾方法


過濾 HTTP 請求 , 首先要獲取到 HTTP 請求的資源類型 , 下面是獲取流程 ;

  • 獲取 HTTP 請求 : HTTP 請求就是 HttpRequest 對象 , 該請求就是 HttpObject msg 參數 , HttpRequest httpRequest = (HttpRequest) msg ;
  • 獲取請求資源的 URI 地址 : 通過 HTTP 請求可以獲取 URI 資源地址 , URI uri = new URI(httpRequest.uri()) ;
  • 屏蔽請求 : 判定 URI 地址路徑 , 判定 URI 中的路徑中是否包含 ico , uri.getPath().contains(“ico”) , 如果包含 , 那么直接返回 , 不響應本次請求 ;

上述操作都是在 void channelRead0(ChannelHandlerContext ctx, HttpObject msg) 回調方法中執行的 ;





二、 HTTP 服務器 ( 資源過濾 ) 代碼實現




1 . 服務器主程序

package kim.hsl.http;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpServerCodec; import kim.hsl.netty.ServerHandler;/*** HTTP 服務器* 客戶端使用瀏覽器訪問即可*/ public class HTTPServer {public static void main(String[] args) {// 1. 創建 BossGroup 線程池 和 WorkerGroup 線程池, 其中維護 NioEventLoop 線程// NioEventLoop 線程中執行無限循環操作// BossGroup 線程池 : 負責客戶端的連接// 指定線程個數 : 客戶端個數很少, 不用很多線程維護, 這里指定線程池中線程個數為 1EventLoopGroup bossGroup = new NioEventLoopGroup(1);// WorkerGroup 線程池 : 負責客戶端連接的數據讀寫EventLoopGroup workerGroup = new NioEventLoopGroup();// 2. 服務器啟動對象, 需要為該對象配置各種參數ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup) // 設置 主從 線程組 , 分別對應 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設置 NIO 網絡套接字通道類型.option(ChannelOption.SO_BACKLOG, 128) // 設置線程隊列維護的連接個數.childOption(ChannelOption.SO_KEEPALIVE, true) // 設置連接狀態行為, 保持連接狀態.childHandler( // 為 WorkerGroup 線程池對應的 NioEventLoop 設置對應的事件 處理器 Handlernew ChannelInitializer<SocketChannel>() {// 創建通道初始化對象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 該方法在服務器與客戶端連接建立成功后會回調// 獲取管道ChannelPipeline pipeline = ch.pipeline();// 為管道加入 HTTP 協議的編解碼器 HttpServerCodec,// codec 中的 co 是 coder 編碼器的意思, dec 是 decoder 解碼器的意思// 第一個字符串是編解碼器的名稱pipeline.addLast("HttpServerCodec" , new HttpServerCodec());// 為管道 Pipeline 設置處理器 Hanedlerpipeline.addLast("HTTPServerHandler", new HTTPServerHandler());}});System.out.println("HTTP 服務器準備完畢 ...");ChannelFuture channelFuture = null;try {// 綁定本地端口, 進行同步操作 , 并返回 ChannelFuturechannelFuture = bootstrap.bind(8888).sync();System.out.println("HTTP 服務器開始監聽 8888 端口 ...");// 關閉通道 , 開始監聽操作channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {// 出現異常后, 優雅的關閉bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}} }

2 . 服務器業務邏輯處理類

package kim.hsl.http;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.*; import io.netty.util.CharsetUtil;import java.net.URI;/*** HTTP 服務器處理類* SimpleChannelInboundHandler 是 ChannelInboundHandlerAdapter 子類* HttpObject 指的是服務器端與客戶端處理數據時的數據類型*/ public class HTTPServerHandler extends SimpleChannelInboundHandler<HttpObject> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {if(msg instanceof HttpRequest){ //判斷該 HttpObject msg 參數是否是 Http 請求System.out.println(ctx.channel().remoteAddress() + " 客戶端請求數據 ... ");// HTTP 請求過濾核心代碼 -----------------------------------------------------------// 判定 HTTP 請求類型, 過濾 HTTP 請求// 獲取 HTTP 請求HttpRequest httpRequest = (HttpRequest) msg;// 獲取網絡資源 URIURI uri = new URI(httpRequest.uri());System.out.println("本次 HTTP 請求資源 " + uri.getPath());// 判定 uri 中請求的資源, 如果請求的是網站圖標, 那么直接屏蔽本次請求if(uri != null && uri.getPath() != null && uri.getPath().contains("ico")){System.out.println("請求圖標資源 " + uri.getPath() +", 屏蔽本次請求 !");return;}// HTTP 請求過濾核心代碼 -----------------------------------------------------------// 準備給客戶端瀏覽器發送的數據ByteBuf byteBuf = Unpooled.copiedBuffer("Hello Client", CharsetUtil.UTF_8);// 設置 HTTP 版本, 和 HTTP 的狀態碼, 返回內容DefaultFullHttpResponse defaultFullHttpResponse =new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf);// 設置 HTTP 請求頭// 設置內容類型是文本類型defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");// 設置返回內容的長度defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_LENGTH,byteBuf.readableBytes());// 寫出 HTTP 數據ctx.writeAndFlush(defaultFullHttpResponse);}} }

3 . 執行結果


① 運行服務器 :


② 客戶端訪問 : 經測試 , 用 IE 瀏覽器請求一次 , 用 360 瀏覽器請求兩次 , 這里用 360 瀏覽器測試 ;


③ 服務器端日志 : 第一次是正常請求 , 第二次請求 /favicon.ico 網站圖標資源 , 因此這里將本次請求屏蔽 ;

總結

以上是生活随笔為你收集整理的【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。