Netty:作用场景。

1)Netty可以基于socket实现远程过程调用(RPC)。

2)Netty可以基于WebSocket实现长连接。

3)Netty可以实现Http的服务器,类似于Jetty,Tomcat等Servlet容器。

-------------------------------------------------------------------------------------------------------------------------------------

Netty充当Http服务器,我们通过浏览器去访问服务器的资源,服务器端处理完之后给我们返回响应-----Helloworld。

-------------------------------------------------------------------------------------------------------------------------------------

1)定义一个Server

 1 package com.foreign.netty.helloworld;
2
3 import io.netty.bootstrap.ServerBootstrap;
4 import io.netty.channel.ChannelFuture;
5 import io.netty.channel.EventLoopGroup;
6 import io.netty.channel.nio.NioEventLoopGroup;
7 import io.netty.channel.socket.nio.NioServerSocketChannel;
8
9 /**
10 * Created with IDEA
11 * author:foreign
12 * Date:2018/12/25
13 * Time:23:21
14 */
15 public class TestServer {
16 public static void main(String[] args) throws InterruptedException {
17 /**
18 * 两个事件循环组(死循环) boos接受连接并发送给worker
19 */
20 EventLoopGroup bossLooper = new NioEventLoopGroup();
21 EventLoopGroup workerLooper = new NioEventLoopGroup();
22
23 try {
24 /**
25 * ServerBootstrap 服务端启动
26 * NioServerSocketChannel 通道(反射)
27 */
28 ServerBootstrap serverBootstrap = new ServerBootstrap();
29 serverBootstrap.group(bossLooper, workerLooper).channel(NioServerSocketChannel.class).childHandler(new TestServerInitializer());
30
31 ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
32 channelFuture.channel().closeFuture().sync();
33 } finally {
34 bossLooper.shutdownGracefully();
35 workerLooper.shutdownGracefully();
36 }
37 }
38 }

2)定义一个Initializer

 1 package com.foreign.netty.helloworld;
2
3 import io.netty.channel.ChannelInitializer;
4 import io.netty.channel.ChannelPipeline;
5 import io.netty.channel.socket.SocketChannel;
6 import io.netty.handler.codec.http.HttpServerCodec;
7
8 /**
9 * Created with IDEA
10 * author:foreign
11 * Date:2018/12/25
12 * Time:23:32
13 */
14 public class TestServerInitializer extends ChannelInitializer<SocketChannel> {
15
16 /**
17 * 子处理器, channel被注册好,会被自动创建
18 * @param ch
19 * @throws Exception
20 */
21 @Override
22 protected void initChannel(SocketChannel ch) throws Exception {
23 ChannelPipeline pipeline = ch.pipeline();
24 //编解码
25 pipeline.addLast("httpServerCodec",new HttpServerCodec());
26 //自己定义的handler
27 pipeline.addLast("testHttpServerHandler",new TestHttpServerHandler());
28
29 }
30 }

3)定义一个Handler

1 package com.foreign.netty.helloworld;
2
3 import io.netty.buffer.ByteBuf;
4 import io.netty.buffer.Unpooled;
5 import io.netty.channel.ChannelHandlerContext;
6 import io.netty.channel.SimpleChannelInboundHandler;
7 import io.netty.handler.codec.http.*;
8 import io.netty.util.CharsetUtil;
9
10 import java.net.URI;
11
12 /**
13 * Created with IDEA
14 * author:foreign
15 * Date:2018/12/25
16 * Time:23:34
17 */
18 public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
19 /**
20 * 把结果返回给客户端(回调)
21 */
22 @Override
23 protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
24 if (msg instanceof HttpRequest) {
25
26 HttpRequest httpRequest = (HttpRequest) msg;
27
28 //获取请求的方法类型
29 System.out.println(httpRequest.method().name());
30
31 URI uri = new URI(httpRequest.uri());
32 if("/favicon.io".equals(uri)) {
33 System.out.println("请求了favicon.io 图标");
34 return;
35 }
36
37 ByteBuf content = Unpooled.copiedBuffer("Hello Netty", CharsetUtil.UTF_8);
38 FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, content);
39 response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");
40 response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
41
42 ctx.writeAndFlush(response);
43
44 ctx.channel().close();
45 }
46 }
47 }

4)gradle的配置

plugins {
id 'java'
} group 'com.foreign'
version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8
targetCompatibility = 1.8 repositories {
mavenCentral()
} dependencies {
implementation 'io.netty:netty-all:4.1.10.Final'
testCompile (
"junit:junit:4.11"
)
}

5)运行结果:运行server,并访问该地址。

6)总结:

1)在TestServer类中,启动一个ServerBootStrap的服务器,里面有两个事件循环组,并且通childHandler关联处理器。

2)在TestServerInitializer中加载netty内置的handler和自己的handler。

3)在TestHttpServerHandler中返回数据到客户端。

7)项目代码:https://github.com/fk123456/Netty/

Netty(2) - HelloWorld的更多相关文章

  1. Netty(四)分隔符与定长解码器的使用

    TCP以流的形式进行数据传输,上层的应用协议为了对消息进行划分,往往采用如下的4种方式. (1)消息长度固定,累计读到长度总和为定长len的报文后,就认为读取到了一个完整的消息:然后重新开始读取下一个 ...

  2. Netty(二)入门

    在上篇<Netty(一)引题>中,分别对AIO,BIO,PIO,NIO进行了简单的阐述,并写了简单的demo.但是这里说的简单,我也只能呵呵了,特别是NIO.AIO(我全手打的,好麻烦). ...

  3. Wix学习整理(2)——HelloWorld安装添加UI

    原文:Wix学习整理(2)--HelloWorld安装添加UI 在前一篇随笔Wix学习整理(1)——快速入门HelloWorld中,我们制作的安装包安装界面太简单,没有与用户进行交互的过程.下面我们修 ...

  4. Netty(二)——TCP粘包/拆包

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...

  5. Spring Boot 2.x 快速入门(下)HelloWorld示例详解

    上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...

  6. Netty(一)——Netty入门程序

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7447618.html 有兴趣的可先了解下:4种I/O的对比与选型 主要内容包括: Netty开发环境的搭建 ...

  7. 一起学Netty(一)之 Hello Netty

    一起学Netty(一)之 Hello Netty 学习了:https://blog.csdn.net/linuu/article/details/51306480

  8. 自顶向下深入分析Netty(七)--ChannelPipeline和ChannelHandler总述

    自顶向下深入分析Netty(七)--ChannelPipeline和ChannelHandler总述 自顶向下深入分析Netty(七)--ChannelPipeline源码实现 自顶向下深入分析Net ...

  9. 自顶向下深入分析Netty(六)--Channel总述

    自顶向下深入分析Netty(六)--Channel总述 自顶向下深入分析Netty(六)--Channel源码实现 6.1 总述 6.1.1 Channel JDK中的Channel是通讯的载体,而N ...

随机推荐

  1. Java垃圾回收简介

    Java关键术语 JavaAPI:一系列帮助开发者创建Java应用程序的封装好的库. Java 开发工具包 (JDK):一系列工具帮助开发者创建Java应用程序.JDK包含工具编译.运行.打包.分发和 ...

  2. linux cut-连接文件并打印到标准输出设备上

    博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 cut命令用来显示行中的指定部分,删除文件中指定字段.cut经常用来显示文件的内容,类似于下的type命令. 说明:该命令有两 ...

  3. Python 开发面试题

    Python部分 将一个字符串逆序,不能使用反转函数 求从10到100中能被3或5整除的数的和 What is Python? What are the benefits of using Pytho ...

  4. ZJU cluster

    * loginSSH using MobaXterm: >> ssh kaiming@10.106.239.105

  5. 腾讯云:iptables基础

    iptables 基础 iptables 基本命令 任务时间:5min ~ 10min iptables 可以简单理解为 Linux 系统内核级防火墙 netfilter 的用户态客户端. Linux ...

  6. [bzoj4300][绝世好题] (动规)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  7. ebay 店铺状态

    OrderStatusCodeType @XmlEnumValue("Active") @XmlEnumValue("Inactive") @XmlEnumVa ...

  8. Leetcode 76.最小覆盖子串

    最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...

  9. MVC系统学习2—MVC路由

    在MVC下不是通过对物理文件的映射来实行访问的,而是通过定义后的路由Url来实现访问的.在前一篇讲到我们是在全局文件下进行路由配置. routes.MapRoute(                & ...

  10. [洛谷P1114] “非常男女”计划

    题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人似乎比较合得来. 万圣节来临之际,XXX ...