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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Netty】使用 Netty 开发 HTTP 服务器

發(fā)布時(shí)間:2025/6/17 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Netty】使用 Netty 开发 HTTP 服务器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、 HTTP 服務(wù)器開(kāi)發(fā)
  • 二、 HTTP 服務(wù)器代碼分析
    • 1 . Netty 開(kāi)發(fā) HTTP 服務(wù)器與 TCP 服務(wù)器對(duì)比
    • 2 . ChannelInitializer 設(shè)置
    • 3 . 自定義業(yè)務(wù)邏輯處理器
  • 三、 HTTP 服務(wù)器代碼實(shí)現(xiàn)
    • 1 . 服務(wù)器主程序
    • 2 . 服務(wù)器業(yè)務(wù)邏輯處理類(lèi)
    • 3 . 執(zhí)行結(jié)果





一、 HTTP 服務(wù)器開(kāi)發(fā)



HTTP 服務(wù)器案例需求 :


① HTTP 服務(wù)器端 : 在服務(wù)器端使用 Netty 開(kāi)發(fā) HTTP 服務(wù)器 , 該 HTTP 服務(wù)器監(jiān)聽(tīng) 8888 端口 ;

② 瀏覽器操作 : 瀏覽器中訪問(wèn) http://127.0.0.1:8888/ 地址 , 或 http://localhost:8888/ 地址 , HTTP 服務(wù)器返回 “Hello Client” 信息 ;

③ 信息過(guò)濾 : 客戶(hù)端瀏覽器請(qǐng)求 HTTP 服務(wù)時(shí) , 涉及返回字符串信息時(shí) , 還會(huì)返回其它額外信息 , 如網(wǎng)站圖標(biāo)等信息 , 現(xiàn)在我們只要服務(wù)器返回的字符串信息 , 屏蔽其它信息 , 需要開(kāi)發(fā)信息過(guò)濾機(jī)制 ;





二、 HTTP 服務(wù)器代碼分析




1 . Netty 開(kāi)發(fā) HTTP 服務(wù)器與 TCP 服務(wù)器對(duì)比


HTTP 協(xié)議的服務(wù)器與 TCP 協(xié)議的服務(wù)器程序區(qū)別在于設(shè)置的 ChannelInitializer 和 Handler 中對(duì)數(shù)據(jù)的處理方式不同 ; 其它操作基本類(lèi)似 , 如 :

  • 創(chuàng)建 BossGroup 和 WorkerGroup 兩個(gè)線程池 ;
EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup();
  • 創(chuàng)建 ServerBootstrap 并進(jìn)行配置 , 配置項(xiàng)除了 ChannelInitializer 與 Handler 都一樣 ;
ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) // 設(shè)置 主從 線程組 , 分別對(duì)應(yīng) 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設(shè)置 NIO 網(wǎng)絡(luò)套接字通道類(lèi)型.option(ChannelOption.SO_BACKLOG, 128) // 設(shè)置線程隊(duì)列維護(hù)的連接個(gè)數(shù).childOption(ChannelOption.SO_KEEPALIVE, true) // 設(shè)置連接狀態(tài)行為, 保持連接狀態(tài).childHandler( // 為 WorkerGroup 線程池對(duì)應(yīng)的 NioEventLoop 設(shè)置對(duì)應(yīng)的事件 處理器 Handler// HTTP 協(xié)議與 TCP 協(xié)議不同);
  • 綁定端口 ;
channelFuture = bootstrap.bind(8888).sync();

相同的不再贅述 , 下面針對(duì)不同的技術(shù)點(diǎn)進(jìn)行詳細(xì)描述 ;



2 . ChannelInitializer 設(shè)置


1 . 首先要獲取該客戶(hù)端連接對(duì)應(yīng)的管道 : ChannelPipeline pipeline = ch.pipeline() ;


2 . 設(shè)置 HTTP 協(xié)議的編解碼器 : pipeline.addLast(“HttpServerCodec” , new HttpServerCodec()) , 為管道加入 HTTP 協(xié)議的編解碼器 HttpServerCodec ;


3 . 設(shè)置業(yè)務(wù)邏輯處理器 Handler : pipeline.addLast(“HTTPServerHandler”, new HTTPServerHandler()) , 該業(yè)務(wù)邏輯處理器是用戶(hù)自定義的 ;


4 . 代碼示例 :

ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true) // 核心示例代碼 ---------------------------------------------------------------------.childHandler( // 為 WorkerGroup 線程池對(duì)應(yīng)的 NioEventLoop 設(shè)置對(duì)應(yīng)的事件 處理器 Handlernew ChannelInitializer<SocketChannel>() {// 創(chuàng)建通道初始化對(duì)象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 該方法在服務(wù)器與客戶(hù)端連接建立成功后會(huì)回調(diào)// 獲取管道ChannelPipeline pipeline = ch.pipeline();// 為管道加入 HTTP 協(xié)議的編解碼器 HttpServerCodec,// codec 中的 co 是 coder 編碼器的意思, dec 是 decoder 解碼器的意思// 第一個(gè)字符串是編解碼器的名稱(chēng)pipeline.addLast("HttpServerCodec" , new HttpServerCodec());// 為管道 Pipeline 設(shè)置處理器 Hanedlerpipeline.addLast("HTTPServerHandler", new HTTPServerHandler());}}// 核心示例代碼 ---------------------------------------------------------------------);

3 . 自定義業(yè)務(wù)邏輯處理器


1 . 類(lèi)繼承 : 自定義的業(yè)務(wù)邏輯處理器 , 繼承 SimpleChannelInboundHandler<HttpObject> 類(lèi) ;


2 . 核心方法 : protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception 方法是業(yè)務(wù)邏輯處理的核心方法 , 必須由用戶(hù)自己實(shí)現(xiàn) ;


3 . 判定協(xié)議請(qǐng)求類(lèi)型 : 判定 HttpObject msg 類(lèi)型是否是 HttpRequest 類(lèi)型 , 如果是 , 說(shuō)明該請(qǐng)求是 HTTP 請(qǐng)求 ;

if(msg instanceof HttpRequest){ //判斷該 HttpObject msg 參數(shù)是否是 Http 請(qǐng)求//... }

4 . 返回 HTTP 響應(yīng)數(shù)據(jù) :


① 創(chuàng)建 HTTP 響應(yīng)對(duì)象 : DefaultFullHttpResponse , 設(shè)置 HTTP 協(xié)議的版本 , 響應(yīng)狀態(tài) , 及返回?cái)?shù)據(jù) ;

// 準(zhǔn)備給客戶(hù)端瀏覽器發(fā)送的數(shù)據(jù) ByteBuf byteBuf = Unpooled.copiedBuffer("Hello Client", CharsetUtil.UTF_8);// 設(shè)置 HTTP 版本, 和 HTTP 的狀態(tài)碼, 返回內(nèi)容 DefaultFullHttpResponse defaultFullHttpResponse =new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf);

② 設(shè)置 HTTP 請(qǐng)求頭 : 設(shè)置內(nèi)容類(lèi)型 , 和內(nèi)容長(zhǎng)度 ;

// 設(shè)置 HTTP 請(qǐng)求頭 // 設(shè)置內(nèi)容類(lèi)型是文本類(lèi)型 defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain"); // 設(shè)置返回內(nèi)容的長(zhǎng)度 defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_LENGTH,byteBuf.readableBytes());

③ 寫(xiě)出 HTTP 數(shù)據(jù) : 調(diào)用 ChannelHandlerContext ctx 參數(shù)的 writeAndFlush 即可寫(xiě)出 HTTP 響應(yīng)數(shù)據(jù)到客戶(hù)端 ;

// 寫(xiě)出 HTTP 數(shù)據(jù) ctx.writeAndFlush(defaultFullHttpResponse);

5 . 代碼示例 : 查看下一節(jié)的 服務(wù)器業(yè)務(wù)邏輯處理類(lèi) 代碼 ;





三、 HTTP 服務(wù)器代碼實(shí)現(xiàn)




1 . 服務(wù)器主程序

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 服務(wù)器* 客戶(hù)端使用瀏覽器訪問(wèn)即可*/ public class HTTPServer {public static void main(String[] args) {// 1. 創(chuàng)建 BossGroup 線程池 和 WorkerGroup 線程池, 其中維護(hù) NioEventLoop 線程// NioEventLoop 線程中執(zhí)行無(wú)限循環(huán)操作// BossGroup 線程池 : 負(fù)責(zé)客戶(hù)端的連接// 指定線程個(gè)數(shù) : 客戶(hù)端個(gè)數(shù)很少, 不用很多線程維護(hù), 這里指定線程池中線程個(gè)數(shù)為 1EventLoopGroup bossGroup = new NioEventLoopGroup(1);// WorkerGroup 線程池 : 負(fù)責(zé)客戶(hù)端連接的數(shù)據(jù)讀寫(xiě)EventLoopGroup workerGroup = new NioEventLoopGroup();// 2. 服務(wù)器啟動(dòng)對(duì)象, 需要為該對(duì)象配置各種參數(shù)ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup) // 設(shè)置 主從 線程組 , 分別對(duì)應(yīng) 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設(shè)置 NIO 網(wǎng)絡(luò)套接字通道類(lèi)型.option(ChannelOption.SO_BACKLOG, 128) // 設(shè)置線程隊(duì)列維護(hù)的連接個(gè)數(shù).childOption(ChannelOption.SO_KEEPALIVE, true) // 設(shè)置連接狀態(tài)行為, 保持連接狀態(tài).childHandler( // 為 WorkerGroup 線程池對(duì)應(yīng)的 NioEventLoop 設(shè)置對(duì)應(yīng)的事件 處理器 Handlernew ChannelInitializer<SocketChannel>() {// 創(chuàng)建通道初始化對(duì)象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 該方法在服務(wù)器與客戶(hù)端連接建立成功后會(huì)回調(diào)// 獲取管道ChannelPipeline pipeline = ch.pipeline();// 為管道加入 HTTP 協(xié)議的編解碼器 HttpServerCodec,// codec 中的 co 是 coder 編碼器的意思, dec 是 decoder 解碼器的意思// 第一個(gè)字符串是編解碼器的名稱(chēng)pipeline.addLast("HttpServerCodec" , new HttpServerCodec());// 為管道 Pipeline 設(shè)置處理器 Hanedlerpipeline.addLast("HTTPServerHandler", new HTTPServerHandler());}});System.out.println("HTTP 服務(wù)器準(zhǔn)備完畢 ...");ChannelFuture channelFuture = null;try {// 綁定本地端口, 進(jìn)行同步操作 , 并返回 ChannelFuturechannelFuture = bootstrap.bind(8888).sync();System.out.println("HTTP 服務(wù)器開(kāi)始監(jiān)聽(tīng) 8888 端口 ...");// 關(guān)閉通道 , 開(kāi)始監(jiān)聽(tīng)操作channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {// 出現(xiàn)異常后, 優(yōu)雅的關(guān)閉bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}} }

2 . 服務(wù)器業(yè)務(wù)邏輯處理類(lèi)

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;/*** HTTP 服務(wù)器處理類(lèi)* SimpleChannelInboundHandler 是 ChannelInboundHandlerAdapter 子類(lèi)* HttpObject 指的是服務(wù)器端與客戶(hù)端處理數(shù)據(jù)時(shí)的數(shù)據(jù)類(lèi)型*/ public class HTTPServerHandler extends SimpleChannelInboundHandler<HttpObject> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {if(msg instanceof HttpRequest){ //判斷該 HttpObject msg 參數(shù)是否是 Http 請(qǐng)求System.out.println(ctx.channel().remoteAddress() + " 客戶(hù)端請(qǐng)求數(shù)據(jù) ... ");// 準(zhǔn)備給客戶(hù)端瀏覽器發(fā)送的數(shù)據(jù)ByteBuf byteBuf = Unpooled.copiedBuffer("Hello Client", CharsetUtil.UTF_8);// 設(shè)置 HTTP 版本, 和 HTTP 的狀態(tài)碼, 返回內(nèi)容DefaultFullHttpResponse defaultFullHttpResponse =new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf);// 設(shè)置 HTTP 請(qǐng)求頭// 設(shè)置內(nèi)容類(lèi)型是文本類(lèi)型defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");// 設(shè)置返回內(nèi)容的長(zhǎng)度defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_LENGTH,byteBuf.readableBytes());// 寫(xiě)出 HTTP 數(shù)據(jù)ctx.writeAndFlush(defaultFullHttpResponse);}} }

3 . 執(zhí)行結(jié)果


① 啟動(dòng)服務(wù)器 : 啟動(dòng) HTTP 服務(wù)器 , 監(jiān)聽(tīng) 8888 端口 , 只接收 HTTP 請(qǐng)求 ;


② 瀏覽器訪問(wèn)服務(wù)器 : 瀏覽器中輸入 http://127.0.0.1:8888/ 地址 , 即可訪問(wèn) Netty HTTP 服務(wù)器 , 服務(wù)器返回 Hello Client 字符串信息 ;


③ 服務(wù)器端日志 :

總結(jié)

以上是生活随笔為你收集整理的【Netty】使用 Netty 开发 HTTP 服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一区二区在线播放 | 国产一区二区三区免费观看视频 | 久久久久久久久久一级 | 99热网站 | 久久国产剧情 | 麻豆成人久久精品一区二区三区 | 好吊操这里只有精品 | 欧美另类亚洲 | 69精品无码成人久久久久久 | 午夜免费片 | 精品影视一区二区 | 一区二区三区入口 | 精品丰满少妇一区二区三区 | 一个色综合网 | 人妻少妇被猛烈进入中文字幕 | 99久久99九九99九九九 | 九九热在线播放 | 一区二区三区在线免费观看视频 | 国产婷婷色一区二区三区在线 | 国产精品免费在线播放 | 激情午夜av | 亚洲AV成人无码电影在线观看 | 国产精品夜夜夜爽张柏芝 | 免费黄色大片网站 | 久久精品色妇熟妇丰满人妻 | 蜜臀久久99静品久久久久久 | 激情小说激情视频 | 亚洲av无码一区二区三区dv | 日韩欧美在线视频免费观看 | 一卡二卡三卡在线 | 伊人网在线观看 | 一级在线看 | 日一区二区三区 | 久久免费一区 | 亚洲人成高清 | 福利在线国产 | 欧美激情免费在线观看 | 欧美被狂躁喷白浆精品 | 无码国产精品一区二区色情男同 | gogo人体做爰大胆视频 | 97精品熟女少妇一区二区三区 | 白峰美羽在线播放 | 波多野结衣一本 | 亚洲中文字幕一区二区 | 夜夜躁很很躁日日躁麻豆 | 爽爽视频在线观看 | 狂野少女电影在线观看国语版免费 | 黄色大网站 | 激情小说五月天 | 亚洲乱码国产一区三区 | 少妇脱了内裤让我添 | 夜夜嗨网站 | 黄色网页免费在线观看 | 91亚洲国产成人精品一区二三 | 日韩精品四区 | 丝袜中文字幕 | 久久春色 | 拔擦8x成人一区二区三区 | 日韩亚洲欧美精品 | 欧美成人91 | 亚洲毛片在线 | 欧美一页 | 妖精视频在线观看 | 小敏的受孕日记h | 美国一级大黄一片免费中文 | 色呦呦视频在线观看 | 你懂的视频在线播放 | 蜜臀在线观看 | www激情com | 另类视频在线观看+1080p | 亚洲日本国产精品 | 欧美日韩高清 | 亚洲 欧美 激情 小说 另类 | 影音先锋成人在线 | 午夜理伦三级做爰电影 | 黑人巨大精品欧美一区二区蜜桃 | 成人做爰www免费看视频网站 | 色吧综合 | 牛牛影视一区二区三区 | 日韩在线黄色 | 男女h网站 | 免费黄色小网站 | 一本色道久久88 | 香蕉视频网址 | 中文字幕日韩视频 | 国产女18毛片多18精品 | 亚洲操操 | 日日射天天干 | 黄色一极视频 | 91美女高潮出水 | 老汉色av | 欧美体内谢she精2性欧美 | 国产欧美日韩视频在线观看 | 成人久久久精品国产乱码一区二区 | 日本wwwxxx | a天堂在线观看视频 | 日韩黄色片在线观看 | 欧美影院一区二区 | 欧美粗又大 |