h5网站开发平台百度竞价怎么做效果好
什么是netty
Netty是一个基于Java NIO的异步事件驱动网络应用程序框架。它提供了简单易用的API,用于快速开发可维护的高性能网络应用程序。Netty的设计目标是提供一种高度可扩展的、高性能的网络应用程序框架,使得开发人员能够轻松地构建各种类型的网络应用,包括但不限于服务器通信、实时通信、游戏服务器等。
Netty的核心是基于Channel、EventLoop和Handler的模型。它采用了事件驱动的方式,通过Handler对事件进行处理,实现了高效的并发处理和网络通信。Netty提供了丰富的编解码器和处理器,使得开发人员能够轻松地构建复杂的网络应用逻辑。同时,Netty还提供了高度可定制化的API,使得开发人员能够根据具体需求进行灵活的定制和扩展。
由于其优秀的性能和灵活的设计,Netty被广泛应用于各种类型的网络应用开发,包括高性能的服务器通信、实时通信、大规模并发处理等领域。Netty已经成为Java领域中最受欢迎的网络应用程序框架之一,受到了广泛的认可和应用.
绿色的部分Core核心模块,包括零拷贝、API库、可扩展的事件模型。
橙色部分Protocol Support协议支持,包括Http协议、webSocket、SSL(安全套接字协议)、谷歌Protobuf协议、zlib/gzip压缩与解压缩、Large File Transfer大文件传输等等。
红色的部分Transport Services传输服务,包括Socket、Datagram、Http Tunnel等等。
以上可看出Netty的功能、协议、传输方式都比较全,比较强大。
netty-demo
服务端
public class MyServer {public static void main(String[] args) throws Exception {//创建两个线程组 boosGroup、workerGroupEventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {//创建服务端的启动对象,设置参数ServerBootstrap bootstrap = new ServerBootstrap();//设置两个线程组boosGroup和workerGroupbootstrap.group(bossGroup, workerGroup)//设置服务端通道实现类型 .channel(NioServerSocketChannel.class)//设置线程队列得到连接个数 .option(ChannelOption.SO_BACKLOG, 128)//设置保持活动连接状态 .childOption(ChannelOption.SO_KEEPALIVE, true)//使用匿名内部类的形式初始化通道对象 .childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {//给pipeline管道设置处理器socketChannel.pipeline().addLast(new MyServerHandler());}});//给workerGroup的EventLoop对应的管道设置处理器System.out.println("java技术爱好者的服务端已经准备就绪...");//绑定端口号,启动服务端ChannelFuture channelFuture = bootstrap.bind(6666).sync();//对关闭通道进行监听channelFuture.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
服务端处理器
public class MyServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//获取客户端发送过来的消息ByteBuf byteBuf = (ByteBuf) msg;System.out.println("收到客户端" + ctx.channel().remoteAddress() + "发送的消息:" + byteBuf.toString(CharsetUtil.UTF_8));}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {//发送消息给客户端ctx.writeAndFlush(Unpooled.copiedBuffer("服务端已收到消息,并给你发送一个问号?", CharsetUtil.UTF_8));}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {//发生异常,关闭通道ctx.close();}
}
客户端
public class MyClient {public static void main(String[] args) throws Exception {NioEventLoopGroup eventExecutors = new NioEventLoopGroup();try {//创建bootstrap对象,配置参数Bootstrap bootstrap = new Bootstrap();//设置线程组bootstrap.group(eventExecutors)//设置客户端的通道实现类型 .channel(NioSocketChannel.class)//使用匿名内部类初始化通道.handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//添加客户端通道的处理器ch.pipeline().addLast(new MyClientHandler());}});System.out.println("客户端准备就绪,随时可以起飞~");//连接服务端ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6666).sync();//对通道关闭进行监听channelFuture.channel().closeFuture().sync();} finally {//关闭线程组eventExecutors.shutdownGracefully();}}
}
客户端处理器
ublic class MyClientHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {//发送消息到服务端ctx.writeAndFlush(Unpooled.copiedBuffer("歪比巴卜~茉莉~Are you good~马来西亚~", CharsetUtil.UTF_8));}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//接收服务端发送过来的消息ByteBuf byteBuf = (ByteBuf) msg;System.out.println("收到服务端" + ctx.channel().remoteAddress() + "的消息:" + byteBuf.toString(CharsetUtil.UTF_8));}
}
Netty组件作用简介
EventLoop和EventLoopGroup
Netty中的EventLoop是处理I/O事件的线程,负责处理连接、读写等操作。每个Channel都会被注册到一个EventLoop上,由该EventLoop负责处理该Channel上的所有I/O事件。
而EventLoopGroup则是一组EventLoop的抽象,它管理着一组EventLoop,并负责为每个新创建的Channel分配一个EventLoop。EventLoopGroup可以理解为是一组线程池,用于管理和调度EventLoop的执行。
- 一个EventLoopGroup 包含一个或者多个EventLoop;
- 一个EventLoop 在它的生命周期内只和一个Thread 绑定;
- 所有由EventLoop 处理的I/O 事件都将在它专有的Thread 上被处理;
- 一个Channel 在它的生命周期内只注册于一个EventLoop;
- 一个EventLoop 可能会被分配给一个或多个Channel。
Channel 为Netty 网络操作抽象类,EventLoop 主要是为Channel 处理 I/O 操作,两者配合参与 I/O 操作。当一个连接到达时,Netty 就会注册一个 Channel,然后从 EventLoopGroup 中分配一个 EventLoop 绑定到这个Channel上,在该Channel的整个生命周期中都是有这个绑定的 EventLoop 来服务的 。
channel
Channel是 Java NIO 的一个基本构造。可以看作是传入或传出数据的载体。因此,它可以被打开或关闭,连接或者断开连接。
Bootstrap与ServerBootStrap
Bootstrap和ServerBootStrap是Netty提供的一个创建客户端和服务端启动器的工厂类,使用这个工厂类非常便利地创建启动类,根据上面的一些例子,其实也看得出来能大大地减少了开发的难度。首先看一个类图:
可以看出都是继承于AbstractBootStrap抽象类,所以大致上的配置方法都相同。
一般来说,使用Bootstrap创建启动器的步骤可分为以下几步:
ChannelHandler 与 ChannelPipeline
Netty的ChannelHandler是用于处理入站和出站事件的组件,它可以实现数据的编解码、业务逻辑处理等功能。ChannelHandler可以被添加到ChannelPipeline中,用于处理Channel上的各种事件。
而ChannelPipeline则是一系列ChannelHandler的容器,它负责管理和调度ChannelHandler的执行顺序。当数据在Channel中流动时,会经过ChannelPipeline中的各个ChannelHandler,每个ChannelHandler都可以对数据进行处理、转换或者传递给下一个ChannelHandler。
通过ChannelHandler和ChannelPipeline的组合使用,Netty实现了高度灵活的事件处理机制,使得开发人员能够轻松地构建复杂的网络应用逻辑。同时,ChannelPipeline还支持动态地添加、删除和替换ChannelHandler,使得网络应用的逻辑处理能够根据需求进行灵活的定制和扩展。