小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Netty 搭建Http服务端

Java 额外说明

收录于:52天前

1、通过浏览器请求接口,http://localhost:8000/

Netty Http Server 返回 Netty Http Server

浏览器中文乱码:

response.headers().set(CONTENT_TYPE, "text/plain; Charset=UTF-8");

2、服务器打印的日志

Netty的Http服务器源码如下:

package server;


import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.util.CharsetUtil;

import java.net.URLEncoder;

import static io.netty.handler.codec.http.HttpHeaders.Names.*;
import static io.netty.handler.codec.http.HttpHeaders.Values.KEEP_ALIVE;
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_ENCODING;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;

/**
 * @auther: TF12778
 * @date: 2021/4/13 16:24
 * @description: 通过浏览器请求下面的接口,返回 OK OK OK OK
 * http://localhost:8000/
 */
public class HttpServerHandler extends ChannelInboundHandlerAdapter {

    private final static String responseMsg = "Netty Http Server";

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {

        if (msg instanceof HttpRequest) {
            if ("/favicon.ico".equals(((HttpRequest) msg).getUri())) {
                System.out.println("对于请求图标的请求不做处理,return");
                return;
            }

            byte[] bytes = responseMsg.getBytes(CharsetUtil.UTF_8);
            FullHttpResponse response = new DefaultFullHttpResponse(
                    HTTP_1_1, OK, Unpooled.wrappedBuffer(bytes));
            response.headers().set(CONTENT_TYPE, "text/plain; Charset=UTF-8");

            response.headers().set(CONTENT_LENGTH,
                    response.content().readableBytes());
            response.headers().set(CONNECTION, KEEP_ALIVE);
            response.headers().set(CONTENT_ENCODING, "UTF-8" );
            ctx.writeAndFlush(response);
//            System.out.println("发送成功的数据为:" + Unpooled.wrappedBuffer("OK OK OK OK"
//                    .getBytes()).toString(CharsetUtil.UTF_8));
            System.out.println("发送成功的数据为:" + responseMsg);
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        ctx.close();
    }

}
package server;

import com.sun.net.httpserver.HttpServer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;

/**
 * @auther: TF12778
 * @date: 2021/4/13 16:23
 * @description:
 */
public class HttpNIOServer {
    public void start(int port) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch)
                                throws Exception {
                            // server端发送的是httpResponse,所以要使用HttpResponseEncoder进行编码
                            ch.pipeline().addLast(
                                    new HttpResponseEncoder());
                            // server端接收到的是httpRequest,所以要使用HttpRequestDecoder进行解码
                            ch.pipeline().addLast(
                                    new HttpRequestDecoder());
                            ch.pipeline().addLast(
                                    new HttpServerHandler());
                        }
                    }).option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);
            ChannelFuture f = b.bind(port).sync();
            System.out.println("Http Server has started...");

            f.channel().closeFuture().sync();

        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        HttpNIOServer server = new HttpNIOServer();
        server.start(8000);
    }
}

. . .

相关推荐

额外说明

每天 4 道算法题 - 第 020 天

目录 1、按奇偶排序数组 2、水果成篮 3、子数组的最小值之和 4、超级回文数 1、按奇偶排序数组 给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 </

额外说明

RBAC权限管理系统

RBAC权限管理系统 前言: 框架使用: spring,springMVC,MyBatis 管理工具: Maven 开发工具: eclipse 数据库: MySQL 8.0及以上 数据库管理工具: Navicat Premium 12 项目进度及功能的完

额外说明

MySQL性能优化之索引设计

一、索引设计基石 索引设计基石是什么呢? 小二认为索引设计的基石就是数据表字段类型的合理设计,即选择合适字段类型和设置合适的长度。 选择正确的数据类型,那么在字段上建立索引时,一个数据页可以存储更多的索引,一次读取加载到内存的索引个数更多,同时降低B+t

额外说明

【Unity3D 灵巧小知识点】☀️ | Unity脚本生命周期

Unity小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案

额外说明

一文概览NLP句法分析:从理论到PyTorch实战解读

目录 一、引言 二、句法与语法:定义和重要性 什么是句法? 例子 什么是语法? 例子 句法与语法的重要性 句法的重要性 语法的重要性 三、句法理论:历史与分类 生成语法(Generative Grammar) 背景 例子 依存语法(Dependency

额外说明

C#中的19个LINQ to XML 类

        System.Xml.Linq 命名空间包含 LINQ to XML 的19个类。 LINQ to XML 是内存中的 XML 编程接口,使能轻松有效地修改 XML 文档。         微软在 LINQ 上投入了很大的精力,使我们在编

额外说明

2023.8.29 关于性能测试

目录 什么是性能测试? 性能测试常见术语及其性能测试衡量指标 并发 用户数 响应时间 事务 点击率 吞吐量 思考时间 资源利用率  性能测试分类 基准性能测试 负载性能测试 压力性能测试 可靠性性能测试 性能测试执行流程  什么是性能测试? 性能测试的定

额外说明

Spark案例:Scala版统计单词个数

目录 1、创建Scala项目SparkScalaWordCount 2、创建lib目录,添加spark的jar,并添加作为项目的库

额外说明

Docker【应用 03】给Docker部署的PostgreSQL数据库安装PostGIS插件(安装流程及问题说明)

1.问题说明 项目要做跟GIS相关的应用,导入数据时出现以下报错: [ERR] ERROR: relation "geometry_columns" does not exist 原因是:PostgreSQL数据库没有PostGIS扩展。我们当前的项

额外说明

解决Windows系统缺少找不到dmview.ocx文件的问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个dmview.ocx文件(挑

ads via 小工具