基于Netty实现一个HTTP服务器

这篇具有很好参考价值的文章主要介绍了基于Netty实现一个HTTP服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、序言

Netty因其易编程,高可靠性,高性能的网络IO,在分布式开发中被广泛用于网络通信,比如RocketMQ,Dubbo底层都能看到Netty的身影,高性能的本质是其Reactor线程模型以及异步的编程处理。Reactor有三种模型,常用的有主从 Reactor多线程模式,具体表现如下:

基于Netty实现一个HTTP服务器
在日常开发中,常见基于Netty实现TCP报文传输,本文则基于Netty实现一个HTTP服务器,了解Netty的另一种用法。跟Nginx类似,Netty在HTTP协议栈上也有优越的性能表现,不需要依赖Web容器,所以相比的Tomcat、Jetty等Web容器会更轻量和轻巧。

二、具体实现

新建一个Pom工程,引入Netty的相关依赖:

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

定义Netty服务端NettyHttpServer用作HTTP服务端。创建bossGroup线程组和workerGroup线程组,bossGroup线程组分配一个线程用于轮询注册的通道,监听网络的连接事件,workerGroup用于处理网络的读写IO事件,不指定线程数则默认是CPU核数*2;

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();

同时定义服务启动助手ServerBootstrap,用于管理bossGroup和workerGroup;设置服务端通道实现为NIO,全连接队列的大小为1024,同时增加心跳检测的配置,具体代码如下:

serverBootstrap.group(bossGroup, workerGroup)
        .channel(NioServerSocketChannel.class)
        .option(ChannelOption.SO_BACKLOG, 1024)
        .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
        .childHandler()

接着初始化通道同时向pipeline中添加自定义的处理的handler,针对HTTP请求,Netty给我们提供了核心的HTTP编解码器HttpServerCodec,所以在通道初始化的时候增加HTTP编解码器,同时还有我们自定义的业务处理handler,具体代码如下:

serverBootstrap.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .option(ChannelOption.SO_BACKLOG, 1024)
    .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
    .childHandler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(new HttpServerCodec());
            // 自定义的业务处理handler
            ch.pipeline().addLast(new NettyHttpServerHandler());
        }
    });

之后启动服务端并绑定端口,同时将异步改为同步,之后监听通道关闭的状态和关闭连接池,服务端完整代码如下:

public class NettyHttpServer {

    private int port;

    public NettyHttpServer(int port) {
        this.port = port;
    }

    public void run() throws InterruptedException {
        EventLoopGroup bossGroup = null;
        EventLoopGroup workerGroup = null;
        try {
            bossGroup = new NioEventLoopGroup(1);
            workerGroup = new NioEventLoopGroup();
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new HttpServerCodec());
                            ch.pipeline().addLast(new NettyHttpServerHandler());
                        }
                    });
            // 将异步改为同步
            ChannelFuture future = serverBootstrap.bind(port);
            future.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    if (future.isSuccess()) {
                        System.out.println("端口" + port + "绑定成功!");
                    }
                }
            });
            future.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        new NettyHttpServer(8080).run();
    }
}

剩下就是定义业务处理handler,NettyHttpServerHandler继承抽象类SimpleChannelInboundHandler用于接收数据的传入,类型为HttpObject。当服务端接收到HTTP的请求后,回一个响应”Hello! 我是Netty服务器“,具体代码如下:

public class NettyHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
        //1.判断请求是不是HTTP请求
        if (msg instanceof HttpRequest) {
            DefaultHttpRequest request = (DefaultHttpRequest) msg;
            if ("/favicon.ico".equals(request.uri())) {
                return;
            }
            //2.给浏览器进行响应
            ByteBuf byteBuf = Unpooled.copiedBuffer("Hello! 我是Netty服务器 ", CharsetUtil.UTF_8);
            DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf);
            //2.1 设置响应头
            response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html;charset=utf-8");
            response.headers().set(HttpHeaderNames.CONTENT_LENGTH, byteBuf.readableBytes());
            ctx.writeAndFlush(response);
        }
    }
}

三、实现效果

启动服务端,显示端口绑定成功则说明服务端正常
基于Netty实现一个HTTP服务器
流量器请求指定端口,可以看到在浏览器页面显示服务端返回的数据。
基于Netty实现一个HTTP服务器
到这里,就完成基于Netty实现一个HTTP服务端,主要还是依赖于HTTP的编解码器HttpServerCodec,用于处理浏览器的GET请求,如果要实现POST请求,则需要依赖HttpObjectAggregator编解码器。文章来源地址https://www.toymoban.com/news/detail-424590.html

到了这里,关于基于Netty实现一个HTTP服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 14.Netty源码之模拟简单的HTTP服务器

    HTTP 服务器是我们平时最常用的工具之一。同传统 Web 容器 Tomcat、Jetty 一样,Netty 也可以方便地开发一个 HTTP 服务器。我从一个简单的 HTTP 服务器开始,通过程序示例为你展现 Netty 程序如何配置启动,以及引导器如何与核心组件产生联系。 完整地实现一个高性能、功能完备、

    2024年02月15日
    浏览(48)
  • 游戏服务器中使用Netty进行Http请求管理

    作为游戏服务器,无法避免与第三方系统交互。例如:登陆、充值、中台等,这些平台很多都是Web平台,提供http服务接口。这就需要游戏具备http访问功能。 Netty实现异步http调用。 效率:netty的多路复用技术,实现的异步http可以用很少的几个线程实现同时成百上千个http请求

    2024年02月08日
    浏览(46)
  • 如何用JAVA实现一款高可用的TCP数据传输服务器——【基于netty4.x】

    震惊!这可能是我与底层最接近的一次编程体验 首先netty是一款高性能、封装性良好且灵活、基于NIO(真·非阻塞IO)的开源框架。可以用来手写web服务器、TCP服务器等,支持的协议丰富,如:常用的HTTP/HTTPS/WEBSOCKET,并且提供的大量的方法,十分灵活,可以根据自己的需求量身

    2024年01月19日
    浏览(58)
  • 【项目实战】基于netty-websocket-spring-boot-starter实现WebSocket服务器长链接处理

    项目中需要建立客户端与服务端之间的长链接,首先就考虑用WebSocket,再来SpringBoot原来整合WebSocket方式并不高效,因此找到了netty-websocket-spring-boot-starter 这款脚手架,它能让我们在SpringBoot中使用Netty来开发WebSocket服务器,并像spring-websocket的注解开发一样简单 2.1.1 @ServerEndpo

    2024年02月12日
    浏览(48)
  • HTTP 服务器(基于go实现)

    编写一个 HTTP 服务器,接收客户端 request,并将 request 中带的 header 写入 response header 编写一个 HTTP 服务器, 接收客户端 request,并将 request 中带的 header 写入 response header ,读取当前系统的环境变量中的 VERSION 配置,并写入 response header Server 端记录访问日志包括客户端 IP,HT

    2024年02月11日
    浏览(58)
  • Web服务器实现|基于阻塞队列线程池的Http服务器|线程控制|Http协议

    代码地址:WebServer_GitHub_Addr 摘要 本实验通过C++语言,实现了一个基于阻塞队列线程池的多线程Web服务器。该服务器支持通过http协议发送报文,跨主机抓取服务器上特定资源。与此同时,该Web服务器后台通过C++语言,通过原生系统线程调用 pthread.h ,实现了一个 基于阻塞队列

    2024年02月07日
    浏览(65)
  • 基于C++的简单HTTP服务器实现

    基于C++的简单HTTP服务器实现 一个Web Server就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户

    2024年02月02日
    浏览(51)
  • 基于BaseHTTPRequestHandler的HTTP服务器基础实现

    BaseHTTPRequestHandler 是Python中的一个基类,属于 http.server 模块,用于处理HTTP请求的基本功能。它提供了处理常见HTTP请求方法(如GET、POST等)的默认实现,并允许你在子类中进行定制化扩展。下面详细介绍 BaseHTTPRequestHandler 的主要特点和使用方法: 主要特点: 处理HTTP请求:

    2024年02月08日
    浏览(45)
  • Springboot整合Netty实现RPC服务器

    try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss, worker) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new IdleStateHandler(0, 0, 60)); pipeline.addLast(new JsonDecoder()); pipeline.addLast(new JsonEnco

    2024年04月09日
    浏览(42)
  • 基于Spring Boot2.0 & HTTP/2 实现服务器、客户端

    HTTP协议由于其无状态的特性以及超高的普及率,是当下大部分网站选择使用的应用层协议。然而,HTTP/1.x的底层传输方式的几个特性,已经对应用的整体性能产生了负面影响。特别是,HTTP/1.0在每次的TCP连接上只允许发送一次请求,在HTTP/1.1中增加了请求管线,但是这仅仅解决

    2023年04月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包