返回顶部
首页 > 资讯 > 精选 >怎么开发基于Netty的HTTP/HTTPS应用程序
  • 440
分享到

怎么开发基于Netty的HTTP/HTTPS应用程序

2023-06-20 13:06:19 440人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么开发基于Netty的Http/https应用程序”,在日常操作中,相信很多人在怎么开发基于Netty的HTTP/HTTPS应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么开发基

这篇文章主要介绍“怎么开发基于NettyHttp/https应用程序”,在日常操作中,相信很多人在怎么开发基于Netty的HTTP/HTTPS应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么开发基于Netty的HTTP/HTTPS应用程序”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 一、通过 SSL/TLS 保护应用程序

  • 二、HTTP 编解码器

  • 三、聚合 HTTP 消息

  • 四、HTTP 压缩

  • 五、HTTPS

  • 六、websocket

一、通过 SSL/TLS 保护应用程序

SSL 和 TLS 安全协议层叠在其他协议之上,用以实现数据安全。为了支持 SSL/TLS,Java 提供了 javax.net.ssl 包,它的 SSLContext 和 SSLEngine 类使得实现解密和加密变得相当简单。Netty 通过一个名为 SsLHandler 的 ChannelHandler 实现了这个 api,其中 SSLHandler 在内部使用 SSLEngine 来完成实际工作

Netty 还提供了基于 OpenSSL 工具包的 SSLEngine 实现,比 jdk 提供的 SSLEngine 具有更好的性能。如果 OpenSSL 可用,可以将 Netty 应用程序配置为默认使用 OpenSSLEngine。如果不可用,Netty 将会退回到 JDK 实现

怎么开发基于Netty的HTTP/HTTPS应用程序

下述代码展示了如何使用 ChannelInitializer 来将 SslHandler 添加到 ChannelPipeline 中

public class SslChannelInitializer extends ChannelInitializer<Channel> {    private final SslContext context;    private final boolean startTls;    public SslChannelInitializer(SslContext context, boolean startTls) {        this.context = context;        this.startTls = startTls;    }    @Override    protected void initChannel(Channel ch) throws Exception {        SSLEngine engine = context.newEngine(ch.alloc());        ch.pipeline().addFirst("ssl", new SslHandler(engine, startTls));    }}

大多数情况下,Sslhandler 将是 ChannelPipeline 中的第一个 ChannelHandler,这确保了只有在所有其他的 ChannelHandler 将它们的逻辑应用到数据之后,才会进行加密

SSLHandler 具有一些有用的方法,如表所示,例如,在握手阶段,两个节点将相互验证并且商定一种加密方式,你可以通过配置 SslHandler 来修改它的行为,或者在 SSL/TLS 握手一旦完成之后提供通知,握手阶段之后,所有的数据都将会被加密

方法名称描述
setHandshakeTimeout(long, TimeUnit)
setHandshakeTimeoutMillis(long)
getHandshakeTimeoutMillis()
设置和获取超时时间,超时之后,握手 ChannelFuture 将会被通知失败
setCloseNotifyTimeout(long, TimeUnit)
setCloseNotifyTimeoutMillis(long)
getCloseNotifyTimeoutMillis()
设置和获取超时时间,超时之后,将会触发一个关闭通知并关闭连接,这也会导致通知该 ChannelFuture 失败
handshakeFuture()返回一个在握手完成后将会得到通知的 ChannelFuture,如果握手先前已经执行过,则返回一个包含了先前握手结果的 ChannelFuture
close()
close(ChannelPipeline)
close(ChannelHandlerContext, ChannelPromise)
发送 close_notify 以请求关闭并销毁底层的 SslEngine

二、HTTP 编解码器

HTTP 是基于请求/响应模式的,客户端向服务器发送一个 HTTP 请求,然后服务器将会返回一个 HTTP 响应,Netty 提供了多种多种编码器和解码器以简化对这个协议的使用

下图分别展示了生产和消费 HTTP 请求和 HTTP 响应的方法

怎么开发基于Netty的HTTP/HTTPS应用程序

怎么开发基于Netty的HTTP/HTTPS应用程序

如图所示,一个 HTTP 请求/响应可能由多个数据部分组成,并且总以一个 LastHttpContent 部分作为结束

下表概要地介绍了处理和生成这些消息的 HTTP 解码器和编码器

名称描述
HttpRequestEncoder将 HTTPRequest、HttpContent 和 LastHttpContent 消息编码为字节
HttpResponseEncoder将 HTTPResponse、HttpContent 和 LastHttpContent 消息编码为字节
HttpRequestDecoder将字节编码为 HTTPRequest、HttpContent 和 LastHttpContent 消息
HttpResponseDecoder将字节编码为 HTTPResponse、HttpContent 和 LastHttpContent 消息

下述代码中的 HttpPipelineInitializer 类展示了将 HTTP 支持添加到你的应用程序是多么简单 —— 只需要将正确的 ChannelHandler 添加到 ChannelPipeline 中

public class HttpPipelineInitializer extends ChannelInitializer<Channel> {    private final boolean client;    public HttpPipelineInitializer(boolean client) {        this.client = client;    }    @Override    protected void initChannel(Channel ch) throws Exception {        ChannelPipeline pipeline = ch.pipeline();        if (client) {            // 如果是客户端,则添加 HttpResponseDecoder 处理来自服务器的响应            pipeline.addLast("decoder", new HttpResponseDecoder());            // 如果是客户端,则添加 HttpRequestEncoder 向服务器发送请求            pipeline.addLast("encoder", new HttpRequestEncoder());        } else {            // 如果是服务端,则添加 HttpRequestDecoder 处理来自客户端的请求            pipeline.addLast("decoder", new HttpRequestDecoder());            // 如果是客户端,则添加 HttpResponseEncoder 向客户端发送响应            pipeline.addLast("encoder", new HttpResponseEncoder());        }    }}

三、聚合 HTTP 消息

在 ChannelInitializer 将 ChannelHandler 安装到 ChannelPipeline 中之后,你就可以处理不同类型的 HTTPObject 消息了。但由于 HTTP 请求和响应可能由许多部分组成,因此你需要聚合它们以形成完整的消息。Netty 提供了一个聚合器,它可以将多个消息部分合并为 FullHttpRequest 或者 FullHttpResponse 消息

由于消息分段需要被缓冲,直到可以转发下一个完整的消息给下一个 ChannelInboundHandler,所以这个操作有轻微的开销,其所带来的好处就是你可以不必关心消息碎片了

引入这种自动聚合机制只不过是向 ChannelPipeline 中添加另外一个 ChannelHandler 罢了,下述代码展示了如何做到这一点:

public class HttpAggregatorInitializer extends ChannelInitializer<Channel> {    private final boolean isClient;    public HttpAggregatorInitializer(boolean isClient) {        this.isClient = isClient;    }    @Override    protected void initChannel(Channel ch) throws Exception {        ChannelPipeline pipeline = ch.pipeline();        if (isClient) {            // 如果是客户端,则添加 HttpClientCodec            pipeline.addLast("codec", new HttpClientCodec());        } else {            // 如果是服务器,则添加 HttpServerCodec            pipeline.addLast("codec", new HttpServerCodec());        }        // 将最大的消息大小为 512KB 的 HTTPObjectAggregator 添加到 ChannelPipeline        pipeline.addLast("aggregator", new HttpObjectAggregator(512 * 1024));    }}

四、HTTP 压缩

当使用 HTTP 时,建议开启压缩功能以尽可能多地减小传输数据的大小。虽然压缩会带来一些消耗,但通常来说它都是一个好主意,尤其是对于文本数据而言

Netty 为压缩和解压都提供了 ChannelHandler 实现,它们同时支持 gzip 和 deflate 编码

客户端可以通过提供以下头部信息来指示服务器它所支持的压缩格式

GET /encrypted-area HTTP/1.1

Host: www.example.com

Accept-Encoding: gzip, deflate

然而,需要注意的是,服务器没有义务压缩它所发送的数据

public class HttpCompressionInitializer extends ChannelInitializer<Channel> {    private final boolean isClient;    public HttpCompressionInitializer(boolean isClient) {        this.isClient = isClient;    }    @Override    protected void initChannel(Channel ch) throws Exception {        ChannelPipeline pipeline = ch.pipeline();        if (isClient) {            // 如果是客户端,则添加 HTTPClientCodec            pipeline.addLast("codec", new HttpClientCodec());            // 如果是客户端,则添加 HttpContentDecompressor 以处理来自服务器的压缩内容            pipeline.addLast("decompressor", new HttpContentDecompressor());        } else {            // 如果是服务端,则添加 HttpServerCodec            pipeline.addLast("codec", new HttpServerCodec());            // 如果是服务器,则添加 HttpContentDecompressor 来压缩数据            pipeline.addLast("decompressor", new HttpContentDecompressor());        }    }}

五、HTTPS

启用 HTTPS 只需要将 SslHandler 添加到 ChannelPipeline 的 ChannelHandler 组合中

public class HttpsCodecInitializer extends ChannelInitializer<Channel> {    private final SslContext context;    private final boolean isClient;    public HttpsCodecInitializer(SslContext context, boolean isClient) {        this.context = context;        this.isClient = isClient;    }    @Override    protected void initChannel(Channel ch) throws Exception {        ChannelPipeline pipeline = ch.pipeline();        SSLEngine engine = context.newEngine(ch.alloc());        pipeline.addLast("ssl", new SslHandler(engine));        if (isClient) {            pipeline.addLast("codec", new HttpClientCodec());        } else {            pipeline.addLast("codec", new HttpServerCodec());        }     }}

六、WEBSocket

WebSocket 解决了一个长期存在的问题:既然底层协议(HTTP)是一个请求/响应模式的交互序列,那么如何实时地发布信息呢?ajax一定程度上解决了这个问题,但数据流仍然是由客户端所发送的请求驱动的

WebSocket 提供了在单个 tcp 连接上提供双向的通信,它为网页和远程服务器之间的双向通信提供了一种替代 HTTP 轮询的方案

要想向你的应用程序添加对于 WebSocket 的支持,你需要将适当的客户端或者服务器 WebSocketChannelHandler 添加到 ChannelPipeline 中。这个类将处理由 WebSocket 定义的称为帧的特殊消息类型,如表所示,WebSocketFrame 可以被归类为数据帧或者控制帧

名称描述
BinaryWebSocketFrame数据帧:二进制数据
TextWebSocketFrame数据帧:文本数据
ContinuationWebSocketFrame数据帧:属于上一个 BinaryWebSocketFrame 或者 TextWebSocketFrame 的文本或者二进制的数据
CloseWebSocketFrame控制帧:一个 CLOSE 请求,关闭的状态码以及关闭的原因
PingWebSocketFrame控制帧:请求一个 PongWebSocketFrame
PongWebSocketFrame控制帧:对 PingWebSocketFrame 请求的响应

因为 Netty 主要是一种服务器端技术,所以我们重点创建 WebSocket 服务器。下述代码展示了使用 WebSocketChannelHandler 的简单示例,这个类会处理协议升级握手,以及三种控制帧 —— Close、Ping 和 Pong,Text 和 Binary 数据帧将会被传递给下一个 ChannelHandler 进行处理

public class WebSocketServerInitializer extends ChannelInitializer<Channel> {    @Override    protected void initChannel(Channel ch) throws Exception {        ch.pipeline().addLast(                new HttpServerCodec(),                new HttpObjectAggregator(65536),                // 如果被请求的端点是 /websocket,则处理该升级握手                new WebSocketServerProtocolHandler("/websocket"),                // TextFrameHandler 处理 TextWebSocketFrame                new TextFrameHandler(),                // BinaryFrameHandler 处理 BinaryWebSocketFrame                new BinaryFrameHandler(),                // ContinuationFrameHandler 处理 Continuation WebSocketFrame                new ContinuationFrameHandler());    }    public static final class TextFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {        @Override        protected void messageReceived(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {            // do something        }    }    public static final class BinaryFrameHandler extends SimpleChannelInboundHandler<BinaryWebSocketFrame> {        @Override        protected void messageReceived(ChannelHandlerContext ctx, BinaryWebSocketFrame msg) throws Exception {            // do something        }    }    public static final class ContinuationFrameHandler extends SimpleChannelInboundHandler<ContinuationWebSocketFrame> {        @Override        protected void messageReceived(ChannelHandlerContext ctx, ContinuationWebSocketFrame msg) throws Exception {            // do something        }    }}

到此,关于“怎么开发基于Netty的HTTP/HTTPS应用程序”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么开发基于Netty的HTTP/HTTPS应用程序

本文链接: https://lsjlt.com/news/296563.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么开发基于Netty的HTTP/HTTPS应用程序
    这篇文章主要介绍“怎么开发基于Netty的HTTP/HTTPS应用程序”,在日常操作中,相信很多人在怎么开发基于Netty的HTTP/HTTPS应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么开发基...
    99+
    2023-06-20
  • 如何开发基于Netty的HTTP/HTTPS应用程序
    目录一、通过 SSL/TLS 保护应用程序二、HTTP 编解码器三、聚合 HTTP 消息四、HTTP 压缩五、HTTPS六、WebSocket一、通过 SSL/TLS 保护应用程序 ...
    99+
    2024-04-02
  • 基于RethinkDB +React Native怎么开发Web应用程序
    这篇文章主要讲解了“基于RethinkDB +React Native怎么开发Web应用程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于RethinkDB +React Native怎...
    99+
    2023-06-17
  • 基于Python+Pyqt5开发一个应用程序
    介绍你的那个她/他 1. UI —MainWindow设计界面及代码 # -*- coding: utf-8 -*- # Form implementation genera...
    99+
    2024-04-02
  • 基于HTML 5和CSS3开发的优秀应用程序是怎样的
    本篇文章为大家展示了基于HTML 5和CSS3开发的优秀应用程序是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天向大家展示19个基于 HTML5 和 CS...
    99+
    2024-04-02
  • 基于微服务框架go-micro开发gRPC应用程序
    go-micro是golang的一个微服务框架。这篇文章将介绍使用go-micro最新版本v4开发gRPC服务的方式。 1、安装protoc 这个工具也称为proto编译器,可以用来...
    99+
    2024-04-02
  • python怎么开发应用程序
    这篇文章给大家分享的是有关python怎么开发应用程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用...
    99+
    2023-06-14
  • 基于Javascript怎么开发连连看游戏小程序
    今天小编给大家分享一下基于Javascript怎么开发连连看游戏小程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。01、程...
    99+
    2023-07-05
  • 如何使用Python和npm构建基于http的大数据应用程序?
    Python和npm是两个非常流行的编程语言和包管理器,它们可以用来构建各种应用程序,包括大数据应用程序。在本文中,我们将探讨如何使用Python和npm构建基于HTTP的大数据应用程序。 安装Python和npm 首先,我们需要在本地...
    99+
    2023-10-29
    npm http 大数据
  • 基于HTTP的Web应用开发:如何使用PHP和NPM来提高性能?
    在当今互联网时代,Web应用的开发已经成为了一个极具挑战性和创造性的行业。在这个领域中,性能一直是一个非常重要的因素,因为用户期望能够快速地访问和使用Web应用程序。因此,开发人员需要采取一些措施来优化Web应用程序的性能。在本文中,我们...
    99+
    2023-08-07
    索引 http npm
  • SpringBoot怎么简化Web应用程序的开发
    Spring Boot 是一个开箱即用的微服务框架,它简化了 Spring 应用程序的开发过程。以下是 Spring Boot 简化...
    99+
    2024-04-09
    SpringBoot
  • Node.js WebSocket:现代网络应用程序开发的基石
    WebSocket 的优势 实时通信:WebSocket 允许客户端和服务器之间无延迟地进行双向通信。 服务器推送:服务器可以主动向客户端推送数据,而不必等待客户端发出请求。 高效:WebSocket 使用二进制帧进行通信,比 HTTP...
    99+
    2024-04-02
  • 如何利用ASP和HTTP开发一个高效的Web应用程序?
    ASP和HTTP是开发Web应用程序的两个重要组成部分。它们共同构成了一个高效的Web应用程序。在本篇文章中,我们将讨论如何利用ASP和HTTP开发一个高效的Web应用程序,并为您提供一些示例代码。 ASP是一种基于服务器端的技术,可以用来...
    99+
    2023-10-22
    开发技术 ide http
  • 基于node的cli工具怎么开发使用
    本篇内容介绍了“基于node的cli工具怎么开发使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景公司内部有维护admin和h6两套基础...
    99+
    2023-07-05
  • Linux应用程序开发过程是什么
    Linux应用程序开发过程通常包括以下步骤:1. 确定需求:明确应用程序的功能和目标,并确定用户需求。2. 设计架构:确定应用程序的...
    99+
    2023-09-01
    Linux
  • 基于flask的web应用开发——接受post请求
    目录 0. 前言1. 了解post方法2. 在flask中实现3. 具体讲解 0. 前言 操作系统:Windows10 家庭版 开发环境:Pycahrm Comunity 2022.3 P...
    99+
    2023-10-25
    flask 前端 python
  • 小程序开发的selectorQuery怎么用
    今天小编给大家分享一下小程序开发的selectorQuery怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。select...
    99+
    2023-06-26
  • 怎么用C#Windows应用程序开发添加菜单
    本篇内容主要讲解“怎么用C#Windows应用程序开发添加菜单”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C#Windows应用程序开发添加菜单”吧!C#Windows应用程序开发之添加...
    99+
    2023-06-18
  • 怎么使用Visual Studio 2022开发Linux、C++应用程序
    本篇内容介绍了“怎么使用Visual Studio 2022开发Linux、C++应用程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2023-06-21
  • 适用于移动应用程序开发的最佳PHP框架选择
    laravel、codeigniter和ignite是适用于移动应用程序开发的最佳php框架选择。具体选择依据如下:功能:框架应提供针对移动应用程序开发所需的特定功能。社区支持:活跃的社...
    99+
    2024-05-23
    php 移动应用程序开发 laravel 移动应用程序 地理位置
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作