怎么做hs网站黄页大全18勿看2000网站
怎么做hs网站,黄页大全18勿看2000网站,手机全部网站,做疏通什么网站推广好前言 「作者主页」#xff1a;雪碧有白泡泡 「个人网站」#xff1a;雪碧的个人网站
ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…前言 「作者主页」雪碧有白泡泡 「个人网站」雪碧的个人网站
ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书活动 IO
在Java基础中IO流是一个重要操作先上八股 BIO传统的IO同步阻塞一个连接一个线程。一般不怎么使用AIOJDK7引入的异步非阻塞IONIOJDK1.4之后新的API是多路复用允许你一次性处理多个连接而不需要等待每个连接的完成。NIO 多路复用的核心概念是 Selector选择器和 Channel通道通过Channel、Buffer和Selector来进行数据传输和事件处理
Netty
Netty是建立在NIO之上的一个框架提供了更高级的抽象如ChannelHandler和EventLoop简化了事件处理和网络编程。 执行流程如下图
具有高性能高可靠性高可扩展性还支持多种协议 我们以聊天流程为例 服务端启动客户端启动客户端启动连接上的时候告知服务端服务端读取到客户端的信息后立即发送信息给客户端客户端收到信息后也发送给服务端 1. 引入依赖 dependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.76.Final/version/dependency2. 服务端
Slf4j
public class NettyServer {private final static int PORT 9012;public static void main(String[] args) throws InterruptedException {/*** 包含childGroupchildHandlerconfig继承的父类AbstractBootstrap包括了parentGroup* */ServerBootstrap bootstrap new ServerBootstrap();/*** EventLoopGroup用于处理所有ServerChannel和Channel的所有事件和IO* */EventLoopGroup parentGroup new NioEventLoopGroup();EventLoopGroup childGroup new NioEventLoopGroup();try {/*** 绑定两个事件组* */bootstrap.group(parentGroup, childGroup)/*** 初始化socket定义tcp连接的实例* 内部调用ReflectiveChannelFactory实现对NioServerSocketChannel实例化* channelFactory是在AbstractBootstrap也就是bootstrap的父类* */.channel(NioServerSocketChannel.class)/*** 添加处理器* ChannelInitializer包括了SetChannelHandlerContext initMap** 这里比较有趣的事情就是使用被注册的channel去初始化其他的channel* 等初始化结束后移除该channel* 所以SocketChannel是一个工具** 在bind绑定端口的时候进行初始化和注册initAndRegister* 通过channel channelFactory.newChannel()得到初始化channel* init(channel)真正开始初始化* p channel.pipeline()得到ChannelPipeline* p.addLast开始添加* ch.eventLoop().execute将childHandler赋值并开启一个任务setAutoRead* 所以最后在监听读取的时候将会按照下面添加的channel进行读取** ChannelInitializer继承了ChannelInboundHandlerAdapter* 间接继承ChannelHandlerAdapterChannelInboundHandler* */.childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline ch.pipeline();/*** ByteBuf和String之间的转换** Decoders解密* pipeline.addLast(frameDecoder, new {link LineBasedFrameDecoder}(80))* pipeline.addLast(stringDecoder, new {link StringDecoder}(CharsetUtil.UTF_8))** Encoder加密* pipeline.addLast(stringEncoder, new {link StringEncoder}(CharsetUtil.UTF_8))** 使用上面的加密解密后就可以直接读取字符串* void channelRead({link ChannelHandlerContext} ctx, String msg) {* ch.write(Did you say msg ?\n)* }** */pipeline.addLast(new StringDecoder());pipeline.addLast(new StringEncoder());//自定义处理器pipeline.addLast(new ServerHandler1());}});ChannelFuture future bootstrap.bind(PORT).sync();log.info(服务器已启动);future.channel().closeFuture().sync();} finally {parentGroup.shutdownGracefully();childGroup.shutdownGracefully();}}
}这段代码实现了一个使用Netty框架的服务器端它监听指定的端口并处理客户端的连接请求。 创建一个ServerBootstrap实例用于启动服务器。创建两个EventLoopGroup实例parentGroup用于处理服务器的连接请求childGroup用于处理客户端的数据通信。绑定事件组到ServerBootstrap实例。指定使用的NioServerSocketChannel作为服务器套接字通道的实现类。添加处理器到ChannelInitializer中该处理器负责初始化和配置新连接的SocketChannel。在处理器中通过ChannelPipeline添加了如下处理器 StringDecoder处理传入的字节数据并将其解码为字符串。StringEncoder处理传出的字符串数据并将其编码为字节。ServerHandler1自定义的处理器用于处理客户端发送的消息。 绑定服务器的端口号启动服务器。等待服务器的关闭事件。 处理器
Slf4j
public class ServerHandler1 extends ChannelInboundHandlerAdapter {Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {log.info(Client Address {}读取的信息{}, ctx.channel().remoteAddress(),msg);ctx.channel().writeAndFlush(服务端writeAndFlush我是服务端);ctx.fireChannelActive();//睡眠TimeUnit.MILLISECONDS.sleep(500);}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {//打印异常cause.printStackTrace();//关闭Channel连接并通知ChannelFuture通常是出现异常或者是完成了操作ctx.close();}
}4. 客户端
Slf4j
public class NettyClient {private final static int PORT 9012;private final static String IP localhost;public static void main(String[] args) throws InterruptedException {/*** 服务端是ServerBootstrap客户端是Bootstrap* Bootstrap引导channel连接UDP连接用bind方法TCP连接用connect方法* */Bootstrap bootstrap new Bootstrap();/*** 服务端是EventLoopGroup客户端是NioEventLoopGroup* 这里创建默认0个线程一个线程工厂一个选择器提供者* */NioEventLoopGroup eventLoopGroup new NioEventLoopGroup();try {bootstrap.group(eventLoopGroup)/*** 初始化socket定义tcp连接的实例* */.channel(NioSocketChannel.class).handler(new ChannelInitializerSocketChannel() {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 ClientHandler1());}});ChannelFuture future bootstrap.connect(IP, PORT).sync();log.info(客户端访问);future.channel().closeFuture().sync();} finally {eventLoopGroup.shutdownGracefully();}}
}这段代码实现了一个使用Netty框架的客户端它连接到指定的服务器端并与服务器进行通信。 创建一个Bootstrap实例用于启动客户端。创建一个NioEventLoopGroup实例用于处理客户端的事件和IO操作。绑定事件组到Bootstrap实例。指定使用的NioSocketChannel作为客户端套接字通道的实现类。添加处理器到ChannelInitializer中该处理器负责初始化和配置客户端连接的SocketChannel。在处理器中通过ChannelPipeline添加了如下处理器 StringDecoder处理传入的字节数据并将其解码为字符串。StringEncoder处理传出的字符串数据并将其编码为字节。ClientHandler1自定义的处理器用于处理与服务器之间的通信。 使用Bootstrap的connect()方法连接到指定的服务器IP和端口。等待连接完成。在连接成功后打印日志信息。等待客户端的关闭事件。 处理器
Slf4j
public class ClientHandler1 extends ChannelInboundHandlerAdapter {Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {log.info(客户端读取的信息{}, msg);ctx.channel().writeAndFlush(客户端writeAndFlush我是客户端);TimeUnit.MILLISECONDS.sleep(5000);}/*** 当事件到达pipeline时候触发*/Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ctx.channel().writeAndFlush(客户端开始聊天);}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();//关闭Channel连接ctx.close();}}结果
服务端日志
Client Address /127.0.0.1:63740读取的信息客户端开始聊天
Client Address /127.0.0.1:63740读取的信息客户端writeAndFlush我是客户端
Client Address /127.0.0.1:63740读取的信息客户端writeAndFlush我是客户端客户端日志
客户端读取的信息服务端writeAndFlush我是服务端
客户端读取的信息服务端writeAndFlush我是服务端总结 引导类-Bootstarp和ServerBootstrap
Bootstarp和ServerBootstrap被称为引导类使你的应用程序和网络层相隔离。类似java项目的启动类。
连接-NioSocketChannel
客户端和服务端的启动都是采用配置的channel去连接处理器这里服务端和客户端是用NioSocketChannel
事件组-EventLoopGroup和NioEventLoopGroup
客户端使用的是NioEventLoopGroup服务端使用的是EventLoopGroup。 服务端和客户端的引导类启动后实现了配置的运行客户端和服务端的连接都是采用NioSocketChannel。 连接的流程 客户端创建一个channelchannel对应一个EventLoopEventLoop存放到NioEventLoopGroup中服务端监听到后创建一个channel连接channel对应一个EventLoopEventLoop存放到子的EventLoopGroup父的事件组负责监听一个事件对应一个子事件组。 在这里可以认为父是boss监听组子是工作组。当客户端发送信息的时候先被父监听然后将异步调用工作组。消息会经过事件组的所有处理器。 实际上服务端的事件组也可以使用NioEventLoopGroup。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5e676670b49e40dd83155e76094e9017.png
送书活动 本次送书1~3本【取决于阅读量阅读量越多送的越多】⌛️活动时间截止到2024-1月10号✳️参与方式关注博主三连点赞、收藏、评论 购买链接https://item.jd.com/13836258.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89996.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!