一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java Netty HTTP服務實現過程解析

Java Netty HTTP服務實現過程解析

2020-08-13 16:39猿天地 Java教程

這篇文章主要介紹了Java Netty HTTP服務實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

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

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

創建一個NettyHttpServer來啟動服務

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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: 服務端往客戶端發送數據的行為是Response,所以這邊要使用HttpResponseEncoder將數據進行編碼操作

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

NettyHttpServerHandler:自定義的數據處理類

public class NettyHttpServerHandler extends ChannelInboundHandlerAdapter {

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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請求的方式來獲取請求的參數信息,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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=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:無數據

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.51cto.com/14888386/2516854

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99精品视频在线观看 | 精品成人网 | 色综合天天五月色 | 91亚洲精品国产自在现线 | 免费理伦片在线观看全网站 | 女色在线观看免费视频 | 99久久国产综合精品麻豆 | 人人揉揉香蕉 | 国产精品久久久久久久久久久久久久 | 国产午夜精品久久理论片小说 | 日韩成人在线视频 | 免费在线观看日本 | 国产精品乱码高清在线观看 | 青草青草视频 | 男人狂躁女人下半身 | 99er在线视频| 精品一区二区三区高清免费不卡 | 日韩去日本高清在线 | 思久久 | 极品在线 | 国产在线播放一区 | 99九九国产精品免费视频 | 99精品视频一区在线观看miya | 国产一区二区播放 | 精品亚洲综合在线第一区 | 草莓视频首页 | 久久成人永久免费播放 | 国产一卡二卡3卡4卡四卡在线 | 欧美日韩一区二区三区韩大 | 鬼吹灯天星术在线高清观看 | 色婷婷六月丁香在线观看 | acg火影忍者熟密姬纲手h | 国产欧美日韩综合 | 97porm自拍视频区原创 | 办公室操秘书 | 国产成人精品男人的天堂538 | 日韩精品欧美 | 久久理论片迅播影院一级 | 成人在线视频观看 | 91精品国产91热久久久久福利 | 调教校花浣肠开菊 |