已解决
通过简单demo了解Netty核心组件用法
来自网友在路上 141841提问 提问时间:2023-10-26 09:45:48阅读次数: 41
最佳答案 问答题库418位专家为你答疑解惑
Netty核心组件
- Bootstrap和ServerBootstrap:当需要连接客户端或者服务器绑定指定端口时需要使用Bootstrap,ServerBootstrap有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端 的ServerBootstrap。
- Channel:相当于socket,与另一端进行通信的通道,具备bind、connect、read、write等IO操作的能力。
- EventLoop:事件循环,负责处理Channel的IO事件,一个EventLoopGroup包含多个EventLoop,一个EventLoop可被分配至多个Channel,一个Channel只能注册于一个EventLoop,一个EventLoop只能与一个Thread绑定。
- ChannelFuture:channel IO事件的异步操作结果。
- ChannelHandler:包含IO事件具体的业务逻辑。
- ChannelPipeline:ChannelHandler的管道容器。
DEMO
Netty服务端
public class NettyServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup parentGroup = new NioEventLoopGroup();EventLoopGroup childGroup = new NioEventLoopGroup();try {//2.创建服务端启动引导/辅助类:ServerBootstrapServerBootstrap bootstrap = new ServerBootstrap();//3.给引导类配置两大线程组,确定了线程模型bootstrap.group(parentGroup, childGroup)// (非必备)打印日志.handler(new LoggingHandler(LogLevel.INFO))// 4.指定 IO 模型.channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new StringDecoder());pipeline.addLast(new StringEncoder());/*** 服务端添加IdleStateHandler心跳检测处理器,添加自定义处理Handler类实现userEventTriggered()方法作为超时事件的逻辑处理.* IdleStateHandler心跳检测每十五秒进行一次读检测,如果十五秒内ChannelRead()方法未被调用则触发一次userEventTrigger()方法* 服务端为读IDLE* pipeline.AddLast(new IdleStateHandler(15, 0, 0));//第一个参数为读,第二个为写,第三个为读写全部*/pipeline.addLast(new IdleStateHandler(15, 0, 0, TimeUnit.SECONDS));//5.可以自定义客户端消息的业务处理逻辑pipeline.addLast(new DemoSocketServerHandler());}});// ChannelFuture future = bootstrap.bind(8888).sync().addListener(new ChannelFutureListener() {
// @Override
// public void operationComplete(ChannelFuture channelFuture) throws Exception {
// System.out.println("监听端口已经启动");
// }
// });ChannelFuture future = bootstrap.bind(8888).sync().addListener( future1 -> {if (future1.isSuccess()){System.out.println("监听端口已经启动!");} else {System.out.println("监听端口还未启动!");}} );System.out.println("服务器已启动。。。");future.channel().closeFuture().sync();} finally {parentGroup.shutdownGracefully();childGroup.shutdownGracefully();}}
}
Netty客户端
public class NettyClient {public static void main(String[] args) throws InterruptedException {NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));pipeline.addLast(new DemoSocketClientHandler());}});ChannelFuture future = bootstrap.connect("localhost", 8888).sync();future.channel().closeFuture().sync();} finally {if(eventLoopGroup != null) {eventLoopGroup.shutdownGracefully();}}}
}
服务端处理handler
public class DemoSocketServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();String ip = inetSocketAddress.getAddress().getHostAddress();int port = inetSocketAddress.getPort();super.channelActive(ctx);System.out.println(ip+":"+port+" 上线了");}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println(msg);System.out.println("Client Address ====== " + ctx.channel().remoteAddress());ctx.channel().writeAndFlush("from server:" + UUID.randomUUID());ctx.fireChannelActive();TimeUnit.MILLISECONDS.sleep(500);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent idleStateEvent = (IdleStateEvent) evt;if (idleStateEvent.state() == IdleState.READER_IDLE) {InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();String ip = inetSocketAddress.getAddress().getHostAddress();System.out.println((ip + ":" + inetSocketAddress.getPort() + "close"));ctx.channel().close();}}}
}
客户端处理handler
public class DemoSocketClientHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)throws Exception {System.out.println(msg);ctx.channel().writeAndFlush("from client: " + System.currentTimeMillis());TimeUnit.MILLISECONDS.sleep(5000);}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ctx.channel().writeAndFlush("from client:begin talking");}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}//超时则关闭链路@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent idleStateEvent = (IdleStateEvent) evt;if (idleStateEvent.state() == IdleState.READER_IDLE) {InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();String ip = inetSocketAddress.getAddress().getHostAddress();System.out.println((ip + ":" + inetSocketAddress.getPort() + "close"));ctx.channel().close();}}}
}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"通过简单demo了解Netty核心组件用法":http://eshow365.cn/6-24993-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: JS中this的绑定规则
- 下一篇: 微服务-Eureka