网站建设中的功能,推广普通话ppt课件免费,微商城网站建设教程,徐汇网站制作设计一、Netty服务端开发在开始使用 Netty 开发 TimeServer 之前#xff0c;先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel#xff0c;配置它为非阻塞模式;(2)绑定监听#xff0c;配置TCP 参数#xff0c;例如 backlog 大小;(3)创建一个独立的I/O线程先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel配置它为非阻塞模式;(2)绑定监听配置TCP 参数例如 backlog 大小;(3)创建一个独立的I/O线程用于轮询多路复用器 Selector;(4)创建 Selector将之前创建的 ServerSocketChannel 注册到 Selector 上监听SelectionKey.ACCEPT;(5)启动I/0线程在循环体中执行 Selectorselect0)方法轮询就绪的 Channel;(6)当轮询到了处于就绪状态的 Channel 时需要对其进行判断如果是OP ACCEPT状态说明是新的客户端接入则调用 ServerSocketChannel.accept()方法接受新的客户端:(7)设置新接入的客户端链路 SocketChannel 为非阻塞模式,配置其他的一些TCP 参数(8)将SocketChannel注册到 Selector监听 OP READ 操作位;(9)如果轮询的Channel为OP READ则说明 SocketChannel 中有新的就绪的数据包需要读取则构造ByteBuffer 对象读取数据包;(10)如果轮询的Channel为OP WRITE说明还有数据没有发送完成需要继续发送。import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.timeout.IdleStateHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;public class nettyServer {Logger logger LoggerFactory.getLogger(nettyServer.class);Value(${netty.port})int port;PostConstructpublic void bind() {EventLoopGroup bossrGroup new NioEventLoopGroup();//接收客户端传过来的请求EventLoopGroup wokerGroup new NioEventLoopGroup();//接收到请求后将后续操作try {ServerBootstrap b new ServerBootstrap();b.group(bossrGroup, wokerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024)//.childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new serverHandlerAdapter());ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new HeartbeatHandler());ch.pipeline().addLast(new IdleStateHandler(10, 1, 1));}});ChannelFuture f b.bind(port).sync();} catch (Exception e) {}}import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;public class serverHandlerAdapter extends ChannelInboundHandlerAdapter {Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {super.channelActive(ctx);}Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {super.channelRead(ctx, msg);}Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {super.channelReadComplete(ctx);}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {super.exceptionCaught(ctx, cause);}二、Netty客户端开发import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;public class nettyClient {clientHandlerAdapter clientHandlerAdapter new clientHandlerAdapter();public void conect(String ip, int port) {EventLoopGroup group new NioEventLoopGroup();try {Bootstrap b new Bootstrap();b.group(group).channel(NioSocketChannel.class).remoteAddress(, port).handler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(clientHandlerAdapter);}});b.bind(ip, port).sync();} catch (Exception e) {}}public boolean sendFile() {return clientHandlerAdapter.sendFile();}}我们从 connect 方法讲起在第 13 行首先创建客户端处理 I/0 读写的 NioEventLoopGroup 线程组然后继续创建客户端辅助启动类 Bootstrap随后需要对其进行配置。与服务端不同的是它的 Channel 需要设置为 NioSocketChannel然后为其添加 handler此处为了简单直接创建匿名内部类实现 initChannel 方法其作用是当创建 NioSocketChannel成功之后在初始化它的时候将它的 ChannelHandler 设置到 ChannelPipeline 中用于处理网络I/O事件。客户端启动辅助类设置完成之后调用 connect 方法发起异步连接然后调用同步方法等待连接成功。最后当客户端连接关闭之后客户端主函数退出在退出之前释放 NIO 线程组的资源。下面我们继续看下TimeClientHandler 的代码如何实现