首选设置好了JDK和Maven两个工具

这一章节,我们主要是了解netty的API

图片

对于编写Netty服务器,我们需要一个ChannelHandler,这个组件实现了从服务器到客户端接收数据的处理,也就是业务逻辑

然后是配置服务器的启动代码

关于ChannelHandler,负责接收并响应事件的通知

在本次中,我们需要实现ChannelInbound实现,响应入站的事件,而我们需要处理的事件并不多,所以我们继承了ChannelInboundHandlerAdapter类,内置了ChannelInboundHandler的默认实现

我们需要实现方法

channelRead(),对于传入的消息处理

channelReadComplete(),通知ChannelInboundHandler最后一次调用了

exceptionCaught 读取时候有异常会被调用

我们的代码实现如下

图片

我们重写部分的方法挂载到是事件的声明周期上,对于所有处理方法,利用重写了channelRead(),所以直接在代码中返回给了远程节点

重写了exceptionCaught

来保证捕获异常,再有了异常的时候,我们进行了连接的关闭

如果不捕获异,可能会一直沿着ChannelHandler的实例链,一直到末端

对于客户端的编写,我们需要注意的点有

针对不同的类型事件来驱动ChannelHandler

接下来我们尝试绑定端口,并启动服务

代码如下

图片 图片

首先创建了一个ServerBootstrap的实例,因为是NIO,所以指定了NioEventLoopGroup来接收管理新的连接

Channel则指定了NioServerSocketChannel

然后设定了本地端口

最后指定了channelInitializer,表明一个新的连接创建的时候,一个子Channel也会被创建

这个Initializer会创建一个对应的Handler加到Channel

然后这个程序阻塞等待直到服务器关闭,然后在final中关闭了EventLoop,释放了所有资源

我们使用了NIO完成了上述代码

我们在上述代码中

利用EchoServerHadnler实现了业务逻辑

创建了一个ServerBootstrap引导绑定服务器

创建一个Group来进行事件的处理

指定服务绑定本地的InetSocketAddress

使用一个Init来分配Channel

调用bind来绑定服务器

对于客户端来说,我们要实现的功能有

连接服务器

发送一个或者多个消息

对于每个消息,等待消息返回

关闭连接

客户端也会有一个对应的处理数据的ChannelHandler这一点,我们可以扩展SimpleChannelInbouldHandler

然后,需要处理一下方法

channelActuve,连接建立后调用

channelRead0(),从服务器接收到一条消息时被调用

exceptionCaught.处理过程中出现异常

图片

我们在连接建立成功的时候

利用channelActive,向服务器发送了字符串 Netty rocks

然后是channelRead(),每当接收数据的时候,都会调用,里面用ByteBuf保证了接收

然后是exceptionCaught,用来捕获异常,用于关闭Channel,终止服务器的了解

关于上述继承的不同适配器 SimpleChannelInboundHandler 和 ChannelInboundHandler

是关于消息处理的不同方式

在客户端上,channelRead0()方法已经完成的时候,已经有了传入消息,SImpleChannelInboundHadnler会释放指向保存该消息的ByteBuf的内存引用

ChannelInboundHandler则会一直保存到返回消息的时候释放

图片

在客户端上,不需要固定一个端口用于发送消息,所以我们只需要声明服务器端的端口信息

所以我们创建了一个Bootstrap实例

以及为事件分配分配了一个NioEventLoopGroup实例,其中包括创建新的连接和处理出入站的数据

为服务器连接创建了一个InetSocketAddress实例

连接被建立的时候一个EchoClientHandler会被安装到ChannelPipeline中

一切都完成后,调用Bootstrap.connect来进行远程的连接

发表评论

邮箱地址不会被公开。 必填项已用*标注