• unsupported message type: DefaultFullHttpResponse (expected: ByteBuf, FileRegion) 原因以及解决办法


    使用netty做http服务器的时候 用android链接 会出现这个错误

    原因是http-aggregator顺序有问题

    (ps:目前大部分国内博客都是这个排序有点坑爹):

    官方文档说明:For convenience, consider putting a HttpServerCodec before the HttpObjectAggregator as it functions as both a HttpRequestDecoder and a HttpResponseEncoder.

    package com.sencorsta.ids.httptest;

    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.HttpObjectAggregator;
    import io.netty.handler.codec.http.HttpRequestDecoder;
    import io.netty.handler.codec.http.HttpResponseEncoder;
    import io.netty.handler.stream.ChunkedWriteHandler;

    /**
    * Created by apple on 17/10/21.
    */
    public class HttpServer {

    public static void start(final int port) throws Exception {
    EventLoopGroup boss = new NioEventLoopGroup();
    EventLoopGroup woker = new NioEventLoopGroup();
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    HttpServerHandler httpServerHandler=new HttpServerHandler();
    try {

    serverBootstrap.channel(NioServerSocketChannel.class).group(boss, woker)
    .childOption(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.SO_BACKLOG, 1024)
    .childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
    ch.pipeline().addLast("http-decoder", new HttpRequestDecoder());
    ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));//这里的位置有问题
    ch.pipeline().addLast("http-encoder", new HttpResponseEncoder());
    ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
    ch.pipeline().addLast(httpServerHandler);
    }
    });

    ChannelFuture future = serverBootstrap.bind(port).sync();
    future.channel().closeFuture().sync();
    } finally {
    boss.shutdownGracefully();
    woker.shutdownGracefully();
    }
    }

    public static void main(String[] args) throws Exception {
    start(8080);
    }
    }
    把上面的ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));这一行

    放到coder下面就可以了

    package com.sencorsta.ids.httptest;

    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.HttpObjectAggregator;
    import io.netty.handler.codec.http.HttpRequestDecoder;
    import io.netty.handler.codec.http.HttpResponseEncoder;
    import io.netty.handler.stream.ChunkedWriteHandler;

    /**
    * Created by apple on 17/10/21.
    */
    public class HttpServer {

    public static void start(final int port) throws Exception {
    EventLoopGroup boss = new NioEventLoopGroup();
    EventLoopGroup woker = new NioEventLoopGroup();
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    HttpServerHandler httpServerHandler=new HttpServerHandler();
    try {

    serverBootstrap.channel(NioServerSocketChannel.class).group(boss, woker)
    .childOption(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.SO_BACKLOG, 1024)
    .childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
    ch.pipeline().addLast("http-decoder", new HttpRequestDecoder());
    ch.pipeline().addLast("http-encoder", new HttpResponseEncoder());
    ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));
    ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
    ch.pipeline().addLast(httpServerHandler);
    }
    });

    ChannelFuture future = serverBootstrap.bind(port).sync();
    future.channel().closeFuture().sync();
    } finally {
    boss.shutdownGracefully();
    woker.shutdownGracefully();
    }
    }

    public static void main(String[] args) throws Exception {
    start(8080);
    }
    }
    参考资料:官方说明

  • 相关阅读:
    vue-cli3 打包路径参数说明
    vuex使用map在module的模式下的写法
    普通的JS文件中使用vuex
    vue cli 3+ 版本的source map添加方法
    vue-cli的安装及版本查看/更新
    搭建一个vue项目
    无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
    Centos7开放及查看端口
    记录一次idae和maven设置的巨坑
    解决npm安装node-sass太慢及编译错误问题
  • 原文地址:https://www.cnblogs.com/exmyth/p/15050386.html
Copyright © 2020-2023  润新知