【二】Netty 搭建简单的http服务

news2025/1/23 12:06:18

Netty 搭建简单的http服务

  • Netty 简介
  • 代码展示
    • netty 依赖
    • NettyServer netty 服务端启动类
    • MyChannelInitializer 设置编码解码器,并添加自己的业务方法
    • MyClientHandler 实现自己的业务方法。主要方法 是读取到数据后处理
  • 效果展示
    • 服务端打印截图
    • 采用Postman 测试 截图

Netty 简介

首先netty是什么,官网是这样定义的。
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
Netty是一个异步事件驱动的网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端。
Netty是目前所有NIO框架中性能最好的框架,Java本身提供的有NIO工具,但是在实际操作过程中,复杂繁琐,且对编程人员要求比较高,多线程环境下不容易定位问题,且容易出现问题,所以netty的出现极大的简化了这种操作,且性能稳定高效,其架构设计也非常优秀,值得深入学习总结。
netty官网:https://netty.io/

代码展示

netty 依赖

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.36.Final</version>
        </dependency>

NettyServer netty 服务端启动类

public static void main(String[] args) {
        new NettyServer().bing(8082);
    }

    private void bing(int port) {
        //配置服务端NIO线程组
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(parentGroup, childGroup)
                    .channel(NioServerSocketChannel.class)//非阻塞模式
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    .childHandler(new MyChannelInitializer());
            ChannelFuture future = bootstrap.bind(port).sync();
            System.out.println("hello ,server is start up");
            future.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            parentGroup.shutdownGracefully();
            childGroup.shutdownGracefully();
        }
    }

MyChannelInitializer 设置编码解码器,并添加自己的业务方法

public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        //数据解码操作
        socketChannel.pipeline().addLast(new HttpResponseEncoder());
        //数据编码操作
        socketChannel.pipeline().addLast(new HttpRequestDecoder());
        //在管道中添加自己的业务方法
        socketChannel.pipeline().addLast(new MyClientHandler());
    }
}

MyClientHandler 实现自己的业务方法。主要方法 是读取到数据后处理

public class MyClientHandler extends ChannelInboundHandlerAdapter {

    public void channelRead(ChannelHandlerContext context,Object msg){
        if (msg instanceof HttpRequest){
            DefaultHttpRequest request=(DefaultHttpRequest)msg;
            System.out.println("URI: "+request.uri());
            System.out.println(msg);
        }

        if (msg instanceof HttpContent){
            LastHttpContent content=(LastHttpContent) msg;
            ByteBuf byteBuf=content.content();
            if (!(byteBuf instanceof EmptyByteBuf)){
                //接收msg消息
                byte[]msgByte=new byte[byteBuf.readableBytes()];
                byteBuf.readBytes(msgByte);
                System.out.println(new String(msgByte,Charset.forName("UTF-8")));
            }
        }

        String sendMsg = "hello ni hao,这是netty -respondse 返回的信息.";

        FullHttpResponse response=new DefaultFullHttpResponse(
                HttpVersion.HTTP_1_1,
                HttpResponseStatus.OK,
                Unpooled.wrappedBuffer(sendMsg.getBytes(Charset.forName("UTF-8")))
        );
        //返回值类型
        response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain;charset=UTF-8");
        //返回值的大小
        response.headers().set(HttpHeaderNames.CONTENT_LENGTH,response.content().readableBytes());
        //返回值 保持长连接
        response.headers().set(HttpHeaderNames.CONNECTION,HttpHeaderValues.KEEP_ALIVE);

        context.write(response);
        context.flush();
    }

    public void channelReadComplete(ChannelHandlerContext context){
        context.flush();
    }

    public void exceptionCaught(ChannelHandlerContext context,Throwable c){
        context.close();
        c.printStackTrace();
    }

效果展示

服务端打印截图

在这里插入图片描述

采用Postman 测试 截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDBC 实现增删改查的实际操作,很简单

大家好&#xff0c;今天给大家分享一下JDBC 实现增删改查的实际操作 我们还是使用的Maven的方式&#xff0c; 首先要创建一个干净的Maven webapps项目 看这个就可以了 要导入相关的依赖 <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connec…

如何使用 HTML5 Web 连接到 VMware vSphere Hypervisor

本文将向你展示如何在计算机上连接 VMware vSphere Hypervisor 7.0.3,VMware vSphere Hypervisor 7.0.3 也称为 ESXi 7.0.3。 连接 ESXi 7.0.3 下载工具以管理 ESXi 主机服务器连接 ESXi 7.0.3 服务器下载工具以管理 ESXi 主机服务器 现在不需要任何工具来管理 ESXi 7.0.3,从…

1.8周报

SourceURL:file:///home/mrl/文档/1.8周报.docx 周报 代码行数&#xff1a; 周一 611 周二 672 周三 524 周四 528 周五 450 周六 545 周日 564 遇到的问题&#xff1a; 系统配置问题&#xff1a; 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导…

数据脱敏实战经验

1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt3. 创建自定义序列化器&#xff1a;PrivacySerializer4. 隐私数据隐藏工具类&#xff1a;PrivacyUtil5. 注解使用这两天在整改等保测出的问题&#xff0c;里面有一个“用户…

如何将.md文件转换为pdf

目录 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&#xff09; 2.step2&#xff1a; 安装定制化插件 3.step3&#xff1a; 进入预览窗口模式 4.step4&#xff1a; 进行格式转换 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&a…

【实战篇】39 # 如何实现世界地图的新冠肺炎疫情可视化?

说明 【跟月影学可视化】学习笔记。 世界地图新冠肺炎疫情可视化 下面将实现世界地图新冠肺炎疫情可视化。数据用的是从 2020 年 1 月 22 日到 3 月 19 日这些天的新冠肺炎疫情进展。效果类似下图&#xff1a;https://covid19.who.int/ 步骤一&#xff1a;准备世界地图可视化…

[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

0 最短路径问题 战争时期&#xff0c;胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从 G 点出发&#xff0c;需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#…

不透明度和填充的区别

提纲 1、不透明度和填充的相同之处 2、不透明度和填充的不同之处 3、从字面意思理解不透明度和填充 1、不透明度和填充的相同之处 在初学PS时&#xff0c;一定对“不透明度”和“填充”非常迷惑&#xff0c;它们在图层面板的这个位置 这篇就来详细聊聊这两个滑块&#xff0…

SSR是什么?Vue中怎么实现?

一、是什么 Server-Side Rendering 称其为SSR&#xff0c;意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术&#xff0c;发送到浏览器&#xff0c;然后为其绑定状态与事件&#xff0c;成为完全可交互页面的过程 先来看看Web3个阶段的发展史&#xff1a; 传…

Dart基础

一、dart概述 Dart简介 Dart 是谷歌开发的&#xff0c;类型安全的&#xff0c;面向对象的编程语言&#xff0c;被应用于Web、服务器、移动应用和物联网等领域。Dart 诞生于 2011 年 10 月 10 日Dart简单易学(类似TypeScript, 是强类型的语言)运行方式 原生虚拟机(Dart 代码可…

从执行者到管理者的角色转变

前言 在职场中因为岗位职责的差异&#xff0c;我们通过被分为两种角色&#xff0c;即执行者和管理者&#xff1b;大部分管理者也是从执行者晋升来的。 因为思维的惯性&#xff0c;导致我们会很容易带着执行者的意识去做管理&#xff0c;遇到问题就会想着自己动手去做&#xff0…

智慧防雷+智能防雷的综合应用方案

随着物联网时代的到来&#xff0c;信息共享成为社会运转的动力&#xff0c;伴随着现代建筑、交通、医疗以及工业制造等行业的智能化&#xff0c;大量微电子网络、自动化设备、计算机等投入使用&#xff0c;其集成度高、工作电压小、工作电流低、绝缘强度低、耐过电压和过电流能…

HDMI接口电路设计

HDMI是一个能传输高清视频和多声道音频的接口&#xff0c;常用的有TYPE A&#xff0c;TYPEC&#xff0c;和TYPE D的HDMI&#xff0c;最常用的是这种TYPE A的HDMI接口&#xff0c;这个是母座HDMI TYPE A插座的引脚信号定义大家可以看下&#xff0c;总共包含19个引脚。其中TMDS d…

Hudi的核心概念 —— 索引(Index)

文章目录原理索引选项全局索引与非全局索引索引的选择策略原理 Hudi 通过索引机制提供高效的 upserts&#xff0c;具体是将给定的 hoodie key(record key&#xff08;记录键&#xff09; partition path)与文件 id&#xff08;文件组&#xff09;建立唯一映射。这种映射关系&…

Axure原型模板大全(100多款超高清高保真原型),APP+WEB精美版,绝对大神出品

LIB012 - Axure交互设计常用素材组件包(界面模型、流程图素材)LIB001 - Axure交互原型Web元件库完整版LIB001v2 - Axure WEB前后端交互原型通用元件库 v2LIB003 - Axure交互原型移动端元件库完整版LIB005 - Axure手机移动端交互原型通用元件库 v2LIB006 - Axure IPAD移动端交互…

Java工作流详解(附6大工作流框架对比)

目录1.什么是工作流2.工作流应用场景3.工作流实现方式4.有哪些工作流框架什么是工作流工作流(Worklow)工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流建模&#xff0c;即将工作流程中的工作如前后组织在一起的逻辑和规则&#xff0c;在计算机中以恰当的…

C语言缓冲区与重定向

目录 什么是缓冲区&#xff1f; 刷新策略 模拟实现重定向 标准输出和标准错误有什么区别&#xff1f; 上文提到关闭1号文件&#xff08;标准输出文件&#xff09;&#xff0c;根据文件描述符分配规则&#xff0c;再打开的文件的描述符就是1&#xff0c;看以下代码&#xf…

差分数组详解

目录1.概述2.代码实现3.应用本文参考&#xff1a; LABULADONG 的算法网站 1.概述 &#xff08;1&#xff09;差分数组的思想与前缀和算法的非常近似&#xff08;有关前置和算法的具体细节可以参考前缀和算法这篇文章&#xff09;&#xff0c;其主要适用于频繁地对原始数组的某…

为民服务 智慧政务数据可视化大屏一体化系统

为顺应全球发展趋势&#xff0c;以及我国当前经济社会发展进步的需要&#xff0c;加快政府服务信息化、数字化建设紧跟国际步伐的同时也需要开拓引领。今天给大家分享一个基于 数维图 的 SovitChart编辑器 构建大屏可视化场景的案例——智慧政务数据可视化大屏一体化平台。建设…

RabbitMQ 总结二(MQ原理 通信方式 消息应答机制)

目录 MQ的构成 生产者 交换机 队列 消费者 通信方式 Producer -> Broker (包含Exchange) Exchange -> Binding -> Queue -> Consumer 消息应答 为什么引入消息应答 消息自动重新入队 如何进行消息应答 案例Demo MQ的构成 生产者 消费者 交换机和队列…