欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Netty HTTP服務實現(xiàn)過程解析

 更新時間:2020年08月13日 09:31:36   作者:猿天地  
這篇文章主要介紹了Java Netty HTTP服務實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

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

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

創(chuàng)建一個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>() {
        @Override
        public 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: 服務端往客戶端發(fā)送數(shù)據(jù)的行為是Response,所以這邊要使用HttpResponseEncoder將數(shù)據(jù)進行編碼操作

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

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("歡迎來到猿天地".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版本,返回的狀態(tài)碼,返回的內(nèi)容。

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

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

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

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

下面已GET請求的方式來獲取請求的參數(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:無數(shù)據(jù)");
    } else {
      String content = new String(ByteUtils.objectToByte(byteData));
      System.out.println("Content:" + content);
    }
}

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot集成Swagger接口分類與各元素排序問題

    Spring Boot集成Swagger接口分類與各元素排序問題

    這篇文章主要介紹了Spring Boot集成Swagger接口分類與各元素排序問題,首先我們需要對Swagger中的接口也就是以Controller 層作為第一級梯度進行組織的,Controller在我們實際開發(fā)中,與其他具體接口之間是存在一對多的關系,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2023-10-10
  • java算法之靜態(tài)內(nèi)部類實現(xiàn)雪花算法

    java算法之靜態(tài)內(nèi)部類實現(xiàn)雪花算法

    這篇文章主要介紹了java算法之靜態(tài)內(nèi)部類實現(xiàn)雪花算法,對算法感興趣的同學,一定要看一下
    2021-05-05
  • Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解

    Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解

    Metrics是一個Java庫,可以對系統(tǒng)進行監(jiān)控,統(tǒng)計一些系統(tǒng)的性能指標。本文就來和大家詳細聊聊這個工具的具體使用,希望對大家有所幫助
    2022-11-11
  • Java發(fā)送郵件javax.mail的實現(xiàn)方法

    Java發(fā)送郵件javax.mail的實現(xiàn)方法

    這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實現(xiàn)方法,具有一定的參考價值,代碼都有詳細的注釋,感興趣的小伙伴們可以參考一下
    2016-01-01
  • SpringBoot框架如何管理Xml和CSV

    SpringBoot框架如何管理Xml和CSV

    XML是可擴展標記語言,是一種用于標記電子文件使其具有結(jié)構性的標記語言。CSV是一種通用的、相對簡單的文件格式,通常被用在大數(shù)據(jù)領域,進行大規(guī)模的數(shù)據(jù)搬運操作,本文將介紹SpringBoot框架如何管理Xml和CSV
    2021-06-06
  • java return用法實例詳解

    java return用法實例詳解

    在本篇文章里小編給大家整理的是關于java return用法以及相關知識點總結(jié),需要的朋友們參考下。
    2019-08-08
  • SpringBoot 中 AutoConfiguration的使用方法

    SpringBoot 中 AutoConfiguration的使用方法

    這篇文章主要介紹了SpringBoot 中 AutoConfiguration的使用方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Springboot和Jpa實現(xiàn)學生CRUD操作代碼實例

    Springboot和Jpa實現(xiàn)學生CRUD操作代碼實例

    這篇文章主要介紹了Springboot和Jpa實現(xiàn)學生CRUD操作代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • hbase訪問方式之java api

    hbase訪問方式之java api

    這篇文章主要介紹了hbase訪問方式之java api,需要的朋友可以參考下
    2017-09-09
  • Springboot解決no main manifest attribute錯誤

    Springboot解決no main manifest attribute錯誤

    在開發(fā)Springboot項目時,使用java -jar命令運行jar包可能出現(xiàn)no main manifest attribute錯誤,本文就來介紹一下該錯誤的解決方法,感興趣的可以了解一下
    2024-09-09

最新評論