一周学会netty之核心组件和设计

1、使用netty实现一个服务端程序

该程序在ACCEPT到任何connection后,不处理数据,只是简单的返回
一个时间戳!
代码路径:com.miller.nettyox.sevice.TimeServerHandler

2、使用netty写一个客户端的程序

该程序用于向服务端发出请求,获取当前时间,
拿到时间戳以后,将时间戳转换为“客观”能够
看懂的样子!
代码路径:com.miller.nettyox.client.TimeClient

3、使用netty实现服务端和客户端程序的不同姿势

Bootstrap is similar to ServerBootstrap except that it's for non-server channels such as a client-side or connectionless channel.
If you specify only one EventLoopGroup, it will be used both as a boss group and as a worker group. The boss worker is not used for the client side though.
Instead of NioServerSocketChannel, NioSocketChannel is being used to create a client-side Channel.
Note that we do not use childOption() here unlike we did with ServerBootstrap because the client-side SocketChannel does not have a parent.
We should call the connect() method instead of the bind() method.

4、Dealing with a Stream-based Transport

在基于流的传输(例如TCP / IP)中,接收到的数据存储在套接字接收缓冲区中。 不幸的是,基于流的传输的缓冲区不是数据包队列,而是字节
队列。 这意味着,即使您将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一堆字节。 因此,不能保证您
阅读的内容完全是您的远程对等方写的内容。 例如,让我们假设操作系统的TCP / IP堆栈已收到三个数据包:

5、netty的核心组件和设计一

a/Channel  ---Socket
b/EventLoop ---控制流、多线程处理、并发
c/ChannelFuture  ---异步通知
此三者合起来可以称的上是Netty网络抽象的代表了!

基本的I/O操作(bind()、connect()、read()、write())依赖于底层网络传输所提供的原语。在基于java的网络编程中
,其基本的构造是class Socket 。Netty的Channel接口锁提供的API大大降低了使用Socket类的复杂性。
 
 此外,Channel也拥有许多预定有的、专门实现的广泛类层次结构的。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210303165614864.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY3MDkyOA==,size_16,color_FFFFFF,t_70#pic_center

EventLoop定义了Netty的核心抽象,用于处理“连接”整个生命周期中发生的事件!(loop ,翻译为:环,指代整个生命周期)

* EventLoopGroup 包含一个或者多个EventLoop;
* 一个EventLoop在它的生命周期内只和一个Thread绑定;
* 所有又EventLoop处理的I/O事件都将在它专有的Thread上被处理;
* 一个channel在它的生命周期内只注册在一个EventLoop;
* 一个EventLoop可能会被分配一个或者多个channel。

在这种设计中,一个channel的i/操作都是由相同的Thread执行的,实际上消除了对于同步的需求。

特别注意:netty中所有的I/O操作都是异步的。一个操作可能不会立刻返回,所以我们需要一种在之后的
某个时间节点确定其结果的方法。为此Netty提供了ChannelFuture接口,其addListener()方法接收一个
ChannelFutureListener类型的参数,以便在某个操作完成时得到通知!(监听器,这个在java的swing
包做界面开发的时候监听器去监听按钮事件(鼠标事件或者键盘事件)是一样的道理)。

##6、 netty的核心组件和设计二 ChannelHandler和ChannelPipeline

从开发人员的角度来看,Netty的主要主键就是ChannelHandler,它是所有入站和出站数据的应用程序逻辑
的容器。
实例代码
 
//实现一个时间服务器,建立新的链接后,不接受任何消息,直接返回一个32位整型的时间戳
public class TimeServerHandler extends ChannelInboundHandlerAdapter {
    //路过的各位亲,你们需要怎么被处理,把需要的处理逻辑都写在这里吧!
    @Override
    public void channelActive(final ChannelHandlerContext ctx) { // (1)
        final ByteBuf time = ctx.alloc().buffer(4); // (2)
        time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));
    final ChannelFuture f = ctx.writeAndFlush(time); // (3)
    f.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) {
            assert f == future;
            ctx.close();
        }
    }); // (4)
}

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

}

ChannelInboundHandlerAdapter是一个你经常会实现的子接口,这种类型的ChannelHandler接收入站事件和数据,这些数据
随后将会被你的应用程序的业务逻辑所处理。

ChannelPipeline为ChannelHandler链提供了容器!

在这里插入图片描述

ChannelHandler就相当于“增压泵”、“石英砂过滤器”等!他们是被安装在ChannelPipeLine中的!
当ChannelHandler被添加到ChannelPipeline时,它将会被分配一个ChannelHandlerContext,其代表
了ChannelHandler和ChannelPipeline之间的绑定。

7、更加深入的了解ChannelHandler

有许多不同类型的ChannelHandler,他们各自的功能主要取决于他们的超类。Netty以适配器的形式
提供了大量的CHannelHandler实现,旨在简化应用程序处理逻辑的开发过程。

8、Netty的引导类

netty的引导类为应用程序的网络层配置提供了容器。
引导类型有2中:
a\Bootstrap 用于客户端
b\ServerBootstrap 用于服务端
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值