电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java Netty HTTP服務實現過程解析

瀏覽:4日期:2022-08-27 11:12:58

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。

在后端開發中接觸HTTP協議的比較多,目前大部分都是基于Servlet容器實現的Http服務,往往有一些核心子系統對性能的要求非常高,這個時候我們可以考慮采用NIO的網絡模型來實現HTTP服務,以此提高性能和吞吐量,Netty除了開發網絡應用非常方便,還內置了HTTP相關的編解碼器,讓用戶可以很方便的開發出高性能的HTTP協議的服務,Spring Webflux默認是使用的Netty。

接下來我們簡單的介紹下如何使用Netty來構建一個簡單的Http服務

創建一個NettyHttpServer來啟動服務

public static void main(String[] args) { int port = 2222; new NettyHttpServer().run(port);}public void run(int port) { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new HttpResponseEncoder(),new HttpRequestDecoder(),new NettyHttpServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true); try { ChannelFuture f = bootstrap.bind(port).sync(); f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }}

需要關注的是下面的這行代碼:

ch.pipeline().addLast(new HttpResponseEncoder(),new HttpRequestDecoder(),new NettyHttpServerHandler());

HttpResponseEncoder: 服務端往客戶端發送數據的行為是Response,所以這邊要使用HttpResponseEncoder將數據進行編碼操作

HttpRequestDecoder:服務端接收到數據的行為是Request,所以要使用HttpRequestDecoder進行解碼操作

NettyHttpServerHandler:自定義的數據處理類

public class NettyHttpServerHandler extends ChannelInboundHandlerAdapter {

public class NettyHttpServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,Unpooled.wrappedBuffer('歡迎來到猿天地'.getBytes('utf-8'))); response.headers().set(Names.CONTENT_TYPE, 'text/plain;charset=UTF-8'); response.headers().set(Names.CONTENT_LENGTH, response.content().readableBytes()); response.headers().set(Names.CONNECTION, Values.KEEP_ALIVE); ctx.write(response); ctx.flush(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); cause.printStackTrace(); }}

通過DefaultFullHttpResponse構建了返回的對象,設置了HTTP版本,返回的狀態碼,返回的內容。

返回的響應頭通過response.headers().set()進行設置。

到此為止,一個簡單的HTTP服務就實現好了,我們啟動服務,在瀏覽器中輸入http://localhost:2222/ 就可以看到頁面中顯示的內容是:歡迎來到猿天地

上面演示的是一個典型的請求響應模式,一般我們開發接口的時候通常都是需要根據請求的參數進行對應的數據返回,如何在Netty中獲取請求的參數呢?

channelRead方法中的msg參數就是請求信息,通過msg可以獲取到請求的所有信息,有請求頭信息(包括請求的地址,GET請求的參數),請求體(POST請求的數據)。

下面已GET請求的方式來獲取請求的參數信息,代碼如下:

if (msg instanceof HttpRequest) { DefaultHttpRequest request = (DefaultHttpRequest) msg; System.out.println('URI:' + request.getUri()); System.err.println(msg);}if (msg instanceof HttpContent) { LastHttpContent httpContent = (LastHttpContent) msg; ByteBuf byteData = httpContent.content(); if (byteData instanceof EmptyByteBuf) { System.out.println('Content:無數據'); } else { String content = new String(ByteUtils.objectToByte(byteData)); System.out.println('Content:' + content); }}

重啟服務,訪問地址加上參數進行訪問:http://localhost:2222/?name=yjh

可以看到控制臺輸出的內容就是一個完整的HTTP請求包含的信息:

URI:/?name=yjhDefaultHttpRequest(decodeResult: success, version: HTTP/1.1)GET /?name=yjh HTTP/1.1Host: localhost:2222Connection: keep-aliveUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Cookie: _ga=GA1.1.939107719.1520393952; JSESSIONID=EE205236911D5BBA145E3021DB472D90Content:無數據

本文只是簡單的介紹了如何在Netty中去實現HTTP服務,如果想要做成Spring MVC這樣的框架那后面的路還很長,請求響應Netty內置了編解碼器,還是有很多工作需要自己去做的。比如參數的獲取,請求的路由,參數映射成對象等….

源碼參考:https://github.com/yinjihuan/netty-im

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺| 蓝牙音频分析仪-多功能-四通道-八通道音频分析仪-东莞市奥普新音频技术有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 上海赞永| 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 网站制作优化_网站SEO推广解决方案-无锡首宸信息科技公司 | 上海logo设计| 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 仓储笼_金属箱租赁_循环包装_铁网箱_蝴蝶笼租赁_酷龙仓储笼租赁 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 蓝牙音频分析仪-多功能-四通道-八通道音频分析仪-东莞市奥普新音频技术有限公司 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | EPDM密封胶条-EPDM密封垫片-EPDM生产厂家 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 一体化污水处理设备-一体化净水设备-「山东梦之洁水处理」 | 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 开云(中国)Kaiyun·官方网站 - 登录入口 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 |