Netty入门级Demo——实现CS端互通

文章目录

    • 一、Netty概述
      • 1. 简介
      • 2. 特点
      • 3.依赖控制工具Gradle
      • 4.Demo

一、Netty概述

demo涉及到的代码已上传至github:https://github.com/2NaCl/nettyCS-Demo/tree/master

1. 简介

Netty是一个异步的,事件驱动的网络应用框架,来应对快速开发。

我们一般会客户端给服务端发送一个http请求,通过验证后,建立一个长连接双向通信,控制层接收请求,业务层进行处理,然后产生数据返回,是我们使用websocket建立长连接的一个流程,而netty的作用就是将http请求发送出来的这些数据根据协议的规范,抽取出事件,形成回调方法去处理。

而之前专栏说过的spark也是对于netty的一种封装,就像SparkStreaming处理数据流的流程,是很类似的,这样的目的就是对于事件有着高效处理的功能。

Netty入门级Demo——实现CS端互通_第1张图片

2. 特点

在设计上

  1. 针对bio/nio指定了一个普通的api
  2. 基于一种可横向扩展的模型将事件分离解决
  3. 可制定性极强的线程模型(对于一个http请求的不同阶段用不同线程去处理)
  4. 支持无连接的数据报文传输。

在使用上

  1. 好文档

从性能上

  1. 更好的吞吐量,更低的延迟
  2. 更少的资源浪费
  3. 零内存拷贝

从安全上

  1. SSL/TLS

3.依赖控制工具Gradle

类似于maven,但是更加灵活,更加强大,但是和xml语言构建的maven不同,Gradle的语言是基于Groove的。

首先搭建好依赖

plugins {
    id 'java'
}

group 'com.fyj'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile (
            "junit:junit:4.11",
            "io.netty:netty-all:4.1.10.Final"
    )
}

4.Demo

创建一个CS Demo,然后逐步去说说流程

  1. 首先创建一个异步事件循环组,一个负责连接,一个负责业务

Netty入门级Demo——实现CS端互通_第2张图片

  1. 对于服务端在启动之前,先进行配置,可以自定义,也可以用封装好的配置

但无论如何,我们需要配置的这个东西,都是在连接成功之后针对管道的配置,所以需要继承基础的初始化父类

在这里插入图片描述

然后重写里面的initChannel方法,创建我们的管道拦截器配置。

在这里插入图片描述

可以创建内部封装好的配置

在这里插入图片描述

也可以创建自己定义的拦截器

在这里插入图片描述
然后在这个拦截器内部,我们可以自己定义要实现什么

public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {

        if (msg instanceof HttpRequest) {

            HttpRequest httpRequest = (HttpRequest) msg;
            System.out.println("请求方法名:" + httpRequest.method().name());
            URI uri = new URI(httpRequest.uri());
            if ("/favicon.ico".equals(uri.getPath())) {
                System.out.println("请求favicon.ico");
            }

            //创建自己的channel处理器
            ByteBuf content = Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8);
            //构造netty内部的相应,将我们的content信息注入
            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());

            ctx.writeAndFlush(response);
        }
    }
}

  1. 回到Server端,将我们自己的初始化操作添加进来,绑定端口
    Netty入门级Demo——实现CS端互通_第3张图片

  2. 工作结束之后,自动进行回收
    Netty入门级Demo——实现CS端互通_第4张图片

然后基于这个demo进行一个扩展知识点的讲解

我们调用了一个HttpServletCodec,是内部封装好的一个拦截器配置,作用十分强大,对于http请求进行编解码,进行字节码的转换。

另外,还有一点,Netty和SpringMVC甚至是SpringBoot都是差距很大的,因为Netty所负责的业务功能,都被SpringBoot封装好了,就像域名匹配,端口转发,但我们使用Netty的原因更多是为了并发,所以Netty是一个比较底层的框架,甚至没有端口映射,域名匹配的封装 。

  1. 创建一个Client端的连接与Server互通

其实和Server端差不多,我们在Client端要实现的就是连接,并且可以做到端口映射,实现互通。

模型其实都是个Server端差不多的。

先创建线程模型,然后创建连接的配置

Netty入门级Demo——实现CS端互通_第5张图片

同样我们也需要一个Client端的初始化,去做拦截器,和Server是一样的。

Netty入门级Demo——实现CS端互通_第6张图片
控制器去决定我们连接后要干什么

Netty入门级Demo——实现CS端互通_第7张图片

然后注意的是,我们要将之前的http请求的信息种类改成String的种类,并且在两个端的拦截器去除掉httpServerCodec的拦截,不然不会打印出信息的。

你可能感兴趣的:(Netty,netty)