久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java Netty HTTP服務(wù)實(shí)現(xiàn)過(guò)程解析

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

超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。

在后端開發(fā)中接觸HTTP協(xié)議的比較多,目前大部分都是基于Servlet容器實(shí)現(xiàn)的Http服務(wù),往往有一些核心子系統(tǒng)對(duì)性能的要求非常高,這個(gè)時(shí)候我們可以考慮采用NIO的網(wǎng)絡(luò)模型來(lái)實(shí)現(xiàn)HTTP服務(wù),以此提高性能和吞吐量,Netty除了開發(fā)網(wǎng)絡(luò)應(yīng)用非常方便,還內(nèi)置了HTTP相關(guān)的編解碼器,讓用戶可以很方便的開發(fā)出高性能的HTTP協(xié)議的服務(wù),Spring Webflux默認(rèn)是使用的Netty。

接下來(lái)我們簡(jiǎn)單的介紹下如何使用Netty來(lái)構(gòu)建一個(gè)簡(jiǎn)單的Http服務(wù)

創(chuàng)建一個(gè)NettyHttpServer來(lái)啟動(dòng)服務(wù)

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(); }}

需要關(guān)注的是下面的這行代碼:

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

HttpResponseEncoder: 服務(wù)端往客戶端發(fā)送數(shù)據(jù)的行為是Response,所以這邊要使用HttpResponseEncoder將數(shù)據(jù)進(jìn)行編碼操作

HttpRequestDecoder:服務(wù)端接收到數(shù)據(jù)的行為是Request,所以要使用HttpRequestDecoder進(jìn)行解碼操作

NettyHttpServerHandler:自定義的數(shù)據(jù)處理類

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('歡迎來(lái)到猿天地'.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(); }}

通過(guò)DefaultFullHttpResponse構(gòu)建了返回的對(duì)象,設(shè)置了HTTP版本,返回的狀態(tài)碼,返回的內(nèi)容。

返回的響應(yīng)頭通過(guò)response.headers().set()進(jìn)行設(shè)置。

到此為止,一個(gè)簡(jiǎn)單的HTTP服務(wù)就實(shí)現(xiàn)好了,我們啟動(dòng)服務(wù),在瀏覽器中輸入http://localhost:2222/ 就可以看到頁(yè)面中顯示的內(nèi)容是:歡迎來(lái)到猿天地

上面演示的是一個(gè)典型的請(qǐng)求響應(yīng)模式,一般我們開發(fā)接口的時(shí)候通常都是需要根據(jù)請(qǐng)求的參數(shù)進(jìn)行對(duì)應(yīng)的數(shù)據(jù)返回,如何在Netty中獲取請(qǐng)求的參數(shù)呢?

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

下面已GET請(qǐng)求的方式來(lái)獲取請(qǐng)求的參數(shù)信息,代碼如下:

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:無(wú)數(shù)據(jù)'); } else { String content = new String(ByteUtils.objectToByte(byteData)); System.out.println('Content:' + content); }}

重啟服務(wù),訪問(wèn)地址加上參數(shù)進(jìn)行訪問(wèn):http://localhost:2222/?name=yjh

可以看到控制臺(tái)輸出的內(nèi)容就是一個(gè)完整的HTTP請(qǐng)求包含的信息:

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:無(wú)數(shù)據(jù)

本文只是簡(jiǎn)單的介紹了如何在Netty中去實(shí)現(xiàn)HTTP服務(wù),如果想要做成Spring MVC這樣的框架那后面的路還很長(zhǎng),請(qǐng)求響應(yīng)Netty內(nèi)置了編解碼器,還是有很多工作需要自己去做的。比如參數(shù)的獲取,請(qǐng)求的路由,參數(shù)映射成對(duì)象等….

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 少妇淫片aaaaa毛片叫床爽 | 91看片淫黄大片一级在线观看 | 狠狠艹视频 | 国产亚洲一区在线 | 黄色片免费在线观看 | 少妇激烈床戏视频 | 在线观看毛片网站 | 欧美日韩中文字幕 | 欧美日韩中文在线观看 | 日本a视频 | 日韩精品一区二区三区在线观看 | 四虎精品在线 | 一级a毛片 | 国产精品国产 | 福利视频一区二区 | 午夜精品视频在线观看 | 高清av网站 | 日本aaaa | 国产高清视频在线 | 精品国产一区二区在线 | 久久精品一区二区三区四区 | 国产电影精品久久 | 国产日韩一区 | 一区二区三区在线视频播放 | 中文字幕一区二区三区乱码在线 | 亚洲国产精品久久久久 | 高清国产午夜精品久久久久久 | 欧美卡一卡二 | 日韩精品www | 黑人精品| 日日干日日爽 | 91亚洲高清| 91九色视频国产 | 国产精品99久久久久久久久久久久 | 久久99这里只有精品 | 成人免费视频网站在线看 | 日韩在线成人av | 国产欧美一区二区三区国产幕精品 | 福利影院在线观看 | 91久久精品日日躁夜夜躁国产 | 日韩综合网 |