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,它是所有入站和出站数据的应用程序逻辑
的容器。
实例代码 |
|
---|
}
ChannelInboundHandlerAdapter是一个你经常会实现的子接口,这种类型的ChannelHandler接收入站事件和数据,这些数据
随后将会被你的应用程序的业务逻辑所处理。
ChannelPipeline为ChannelHandler链提供了容器!
ChannelHandler就相当于“增压泵”、“石英砂过滤器”等!他们是被安装在ChannelPipeLine中的!
当ChannelHandler被添加到ChannelPipeline时,它将会被分配一个ChannelHandlerContext,其代表
了ChannelHandler和ChannelPipeline之间的绑定。
7、更加深入的了解ChannelHandler
有许多不同类型的ChannelHandler,他们各自的功能主要取决于他们的超类。Netty以适配器的形式
提供了大量的CHannelHandler实现,旨在简化应用程序处理逻辑的开发过程。
8、Netty的引导类
netty的引导类为应用程序的网络层配置提供了容器。
引导类型有2中:
a\Bootstrap 用于客户端
b\ServerBootstrap 用于服务端