在上一篇的基础上修改代码

1、TestHttpServerHandle  类

package com.example.firstexample;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil; import java.net.URI; public class TestHttpServerHandle extends SimpleChannelInboundHandler<HttpObject>{ //读取客户端发送过来的请求,并且向客户端返回响应
protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception { CommonUtil.println(httpObject.getClass());
CommonUtil.println(channelHandlerContext.channel().remoteAddress());
if(httpObject instanceof HttpRequest){
HttpRequest httpRequest = (HttpRequest) httpObject; CommonUtil.println("请求方法名:" + httpRequest.method().name() + ",uri:" + httpRequest.uri()); URI uri = new URI(httpRequest.uri());
if("/favicon.ico".equals(uri.getPath())){
CommonUtil.println("请求favicon.ico");
return;
} ByteBuf content = Unpooled.copiedBuffer("Hello world", CharsetUtil.UTF_8);
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,content);
response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain");
response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
//写回客户端
channelHandlerContext.writeAndFlush(response);
//channelHandlerContext.close();
} } @Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
CommonUtil.println("channel Active");
super.channelActive(ctx);
} @Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
CommonUtil.println("channel Registered");
super.channelRegistered(ctx);
} @Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
CommonUtil.println("channel Added");
super.handlerAdded(ctx);
} @Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
CommonUtil.println("channel Inactive");
super.channelInactive(ctx);
} @Override
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
CommonUtil.println("channel Unregistered");
super.channelUnregistered(ctx);
}
}

  

2、增加公共类CommonUtil

public class CommonUtil {
public static void println(String msg){
System.out.println(String.format("[thread-%s] %s",Thread.currentThread().getId(), msg));
} public static void println(Object msg){
println(msg.toString());
}
}

  

3、运行结果

使用postman调用

控制台打印如下图

Netty回调与Channel执行流程分析的更多相关文章

  1. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  2. 报时机器人的rasa shell执行流程分析

      本文以报时机器人为载体,介绍了报时机器人的对话能力范围.配置文件功能和训练和运行命令,重点介绍了rasa shell命令启动后的程序执行过程. 一.报时机器人项目结构 1.对话能力范围 (1)能够 ...

  3. Netty执行流程分析与重要组件介绍

    一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle  处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...

  4. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

    最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...

  5. ThinkPHP 框架执行流程分析

    总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...

  6. Spring 文件上传MultipartFile 执行流程分析

    在了解Spring 文件上传执行流程之前,我们必须知道两点: 1.Spring 文件上传是基于common-fileUpload 组件的,所以,文件上传必须引入此包 2.Spring 文件上传需要在X ...

  7. [转]两表join的multi update语句在MySQL中的执行流程分析

    出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...

  8. Hive SQL执行流程分析

    转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command ...

  9. spark-sql执行流程分析

    spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...

随机推荐

  1. Requirements management in confluence

    https://ja.confluence.atlassian.com/doc/blog/2015/08/how-to-document-product-requirements-in-conflue ...

  2. LeetCode刷题:Reverse Words in a String(翻转字符串中的单词)

    题目 Given an input string, reverse the string word by word. For example, Given s = "the sky is b ...

  3. oracle执行计划(一)----概述

    (1)什么是执行计划SQL是一种傻瓜式语言,每一个条件就是一个需求,访问的顺序不同就形成了不同的执行计划.Oracle必须做出选择,一次只能有一种访问路径.一个访问路径就是一个执行计划. (2)执行计 ...

  4. 二、Linux_系统信息查看

    系统信息查看 1. Linux查看cpu核数等信息: [root@tdh01 ~]# grep 'physical id' /proc/cpuinfo | sort -u # 查看物理cpu个数 ph ...

  5. Mac电脑永久路由的添加方法是是什么? Mac校园网连接教程

    学校校园网面向全校师生开放,无奈Windows用户基数大,学校只为Windows平台制作了内网连接工具,Mac平台资源较少,本人查阅相关资料后,总结整理出以下步骤,方便本校学生连接校园网. 有永久路由 ...

  6. 调用office Word Com 组件,提示权限不足处理

    最近一直在处理一个项目,项目主要功能与Office-Word 有关,主要涉及到文本内容编辑与样式设置等相关内容.因项目依赖office 相关dll,需要兼容多种Office 版本(office 200 ...

  7. Gerrit 服务器入门使用-项目的创建与克隆

    Gerrit 服务器入门使用-项目的创建与克隆 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建克隆项目 1>.点击"BROWSE" 2>.点 ...

  8. 关闭firefox火狐浏览器下载完成时自动扫描(49.0.2以后版本)

    本人自己找到的方法,亲测有效,如下:1.在火狐浏览器地址里输入about:config回车,可能会提示“这可能使质量保证失效”,点击[我了解此风险!]2.在搜索框里输入browser.safebrow ...

  9. springmvc手动获取bean

    @Service @Lazy(false) public class SpringContextHolder implements ApplicationContextAware, Disposabl ...

  10. maven mvn跳过生成javadoc 打包报错

    遇到javadoc用maven打包报错的问题,起初没发现javadoc,后发现并在pom看到了javadoc的配置. [ERROR] Failed to execute goal org.apache ...