当前位置: 首页 > news >正文

百度网站好评免费个人logo设计网站

百度网站好评,免费个人logo设计网站,关于英文网站建设的请示,青岛建站模板制作Java编程中BIO、NIO、AIO是三种不同的I/O#xff08;输入/输出#xff09;模型#xff0c;它们代表了不同的I/O处理方式。 Netty就是基于Java的NIO#xff08;New Input/Output#xff09;类库编写的一个高性能、异步事件驱动的网络应用程序框架#xff0c;用于快速开发可…Java编程中BIO、NIO、AIO是三种不同的I/O输入/输出模型它们代表了不同的I/O处理方式。 Netty就是基于Java的NIONew Input/Output类库编写的一个高性能、异步事件驱动的网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端。 先来了解一下基本的三种基本的io模型 BIOBlocking I/O阻塞I/O 定义BIO是Java最传统的I/O模型基于流的同步阻塞I/O操作。每个连接都会占用一个线程当进行I/O操作时线程会被阻塞直到操作完成。 特点 同步阻塞每个I/O操作都会阻塞当前线程直到操作完成。 线程占用每个连接需要一个独立的线程线程资源消耗较大。 实现简单代码实现相对简单易于理解和编写。 作用适用于连接数较少且固定的架构如传统的C/S架构。由于其实现简单、编程直观因此在一些简单的网络编程场景中仍然被使用。 创建客户端和服务端演示数据接收与传输。 //服务端 public static void main(String[] args) {try (ServerSocket serverSocket new ServerSocket(9999)) {while (true) {Socket socket serverSocket.accept(); // 持续监听新连接new Thread(() - { // 为每个客户端创建独立线程try (BufferedReader reader new BufferedReader(new InputStreamReader(socket.getInputStream()))) {String line;while ((line reader.readLine()) ! null) {System.out.println(客户端[ socket.getPort() ] 消息: line);}} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}}//客户端 public static void main(String[] args) {System.out.println(客户端启动...);try {//创建套接字Socket socket new Socket(127.0.0.1, 9999);//获取输出流发送消息PrintStream ps new PrintStream(socket.getOutputStream());Scanner sc new Scanner(System.in);while (true){System.out.println(请输入信息);ps.println(sc.nextLine());ps.flush();}} catch (IOException e) {throw new RuntimeException(e);}}NIONon-blocking I/O非阻塞I/O 定义NIO是Java 1.4引入的新I/O API基于通道Channel和缓冲区Buffer的非阻塞I/O操作。 特点 非阻塞I/O操作不会阻塞线程线程可以在等待数据时执行其他任务。 多路复用通过Selector可以管理多个Channel提高了资源利用率。 高性能适用于高并发场景减少线程开销和上下文切换。 核心组件 缓冲区Buffer用于存储数据的固定大小的内存区域提供了多种类型的缓冲区如ByteBuffer、CharBuffer等。 通道Channel用于数据读写的通道支持非阻塞模式与缓冲区配合使用。 选择器Selector允许单个线程同时处理多个通道的I/O事件。 作用适用于连接数较多且连接较短的架构如高并发的服务器端应用。NIO提供了更高效、更灵活的I/O操作方式显著提高了系统的并发性能和吞吐量。 //服务端public static void main(String[] args) throws Exception {//创建连接通道ServerSocketChannel 绑定端口监听新的客户端连接请求。它本身不处理任何数据传输。ServerSocketChannel serverSocketChannel ServerSocketChannel.open();// 设置通道为非阻塞模式serverSocketChannel.configureBlocking(false);//绑定端口serverSocketChannel.bind(new InetSocketAddress(9999));//创建 Selector 并注册 ACCEPT 事件Selector selector Selector.open();serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println(NIO 服务端启动...);//阻塞等待事件发生while (selector.select()0){//获取到所有事件IteratorSelectionKey iterator selector.selectedKeys().iterator();//遍历所有事件while (iterator.hasNext()){SelectionKey key iterator.next();//检查是否有新的连接请求if(key.isAcceptable()){//为每一个创建新的通道SocketChannel clientChannel serverSocketChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(selector,SelectionKey.OP_READ);}else if(key.isReadable()){//处理读数据SocketChannel channel (SocketChannel)key.channel();ByteBuffer byteBuffer ByteBuffer.allocate(1024);int bytesRead 0;while ((bytesRead channel.read(byteBuffer)) 0){byteBuffer.flip();String message new String(byteBuffer.array(),0,bytesRead);System.out.println(接收客户端信息message);byteBuffer.clear();//回写数据给客户端ByteBuffer response ByteBuffer.wrap((ECHO: message).getBytes());channel.write(response);}}iterator.remove();}}}//客户端 public static void main(String[] args) throws Exception {// 1. 创建 SocketChannel 并连接服务器SocketChannel socketChannel SocketChannel.open();socketChannel.connect(new InetSocketAddress(127.0.0.1, 9999));socketChannel.configureBlocking(false); // 非阻塞模式System.out.println(NIO 客户端已连接);//接收线程new Thread(() - {ByteBuffer buffer ByteBuffer.allocate(1024);while (true) {try {int bytesRead socketChannel.read(buffer);if (bytesRead 0) {buffer.flip();byte[] data new byte[buffer.remaining()];buffer.get(data);System.out.println(收到服务端响应: new String(data));buffer.clear();}} catch (IOException e) {System.out.println(连接已断开);break;}}}).start();//发送消息ByteBuffer byteBuffer ByteBuffer.allocate(1024);Scanner sc new Scanner(System.in);while (true){System.out.println(请输入信息);String msg sc.nextLine();byteBuffer.put((AAmsg).getBytes(StandardCharsets.UTF_8));byteBuffer.flip();socketChannel.write(byteBuffer);byteBuffer.clear();}}AIOAsynchronous I/O异步I/O 定义AIO是Java 7引入的异步I/O API基于异步通道AsynchronousChannel和异步回调机制。 特点 异步非阻塞I/O操作是异步的通过回调处理结果不阻塞线程。 回调机制通过回调函数处理I/O操作结果提高了程序的灵活性。 高性能适用于高并发、高吞吐量的场景。 工作方式 程序发起一个异步I/O请求并提供一个回调函数。 程序无需等待I/O操作完成而是立即返回继续执行其他任务。 当I/O操作完成后系统会调用之前提供的回调函数传递结果或状态信息。 作用适用于连接数较多且连接时间较长的架构如高并发的服务器端应用。AIO提供了真正的异步I/O操作方式进一步提高了系统的并发性能和吞吐量。 Netty 先了解一下netty出现的原因是干嘛用的 Netty出现的原因 Java NIO的复杂性 Java NIO虽然提供了非阻塞IO的能力但其API设计较为底层使用起来比较复杂。开发者需要处理大量的细节如选择器的管理、缓冲区的操作等这增加了开发的难度和出错的风险。 性能瓶颈 在高并发场景下直接使用Java NIO进行网络编程可能会遇到性能瓶颈。例如选择器的实现和多线程管理的复杂性可能导致性能下降。 缺乏高级功能 Java NIO仅提供了基础的非阻塞IO机制缺乏一些高级功能如协议编解码、连接管理等。这些功能在开发网络应用时非常重要但实现起来却相对复杂。 Netty的具体用途是什么 简化网络编程 Netty封装了Java NIO的复杂性提供了一套简洁易用的API。开发者可以使用这些API快速构建网络应用而无需关注底层的细节。 提高性能 Netty采用了异步非阻塞IO模型并支持零拷贝等技术可以在保证高性能的同时减少CPU和内存资源的消耗。这使得Netty在高并发场景下表现尤为出色。 支持多种协议 Netty内置了对多种协议的支持如TCP、UDP、HTTP、WebSocket等。开发者可以轻松地使用这些协议构建网络应用而无需自己实现协议编解码等复杂功能。 灵活的扩展性 Netty提供了丰富的扩展点如ChannelHandler、Codec等。开发者可以通过实现这些接口来扩展Netty的功能以满足特定的业务需求。 广泛的应用场景 Netty经过广泛的使用和验证具有高稳定性和可靠性适用于各种网络应用场景如分布式系统、微服务架构中的通信组件、实时通讯系统、游戏服务器等。 它提供了丰富的错误处理和恢复机制能够有效地处理网络通信中的各种异常情况。 netty核心优势 异步事件驱动、零拷贝、内存池、高度可定制。 核心组件 先大概了解一下 Reactor 模型单线程、多线程、主从多线程。 因为Reactor 模式是 Netty 高性能和高并发能力的核心设计基础。Netty 的线程模型、事件驱动机制和异步非阻塞 I/O 都深度依赖 Reactor 模式。 Reactor 模式是一种 事件驱动的设计模式用于处理高并发的 I/O 请求。其核心思想是 用一个或多个线程监听事件如连接、读写请求并将事件分发给对应的处理器异步处理避免线程阻塞和资源浪费。 Reactor模型的核心组件 事件源Event Source指任何可以产生I/O事件的对象例如网络连接、文件、设备等。 事件循环Event LoopReactor模型的核心负责监控所有事件源的状态并在有事件发生时将其分发给相应的处理程序即回调函数。 事件处理器Event Handler处理特定事件的代码模块通常实现为回调函数或方法。针对特定的事件源每一个事件源通常都有一个相应的处理器用于处理该事件源的I/O事件。 多路复用器Demultiplexer用于监视多个事件源并将发生的事件通知给Reactor。常见的实现包括Java的Selector、Linux的epoll等。 Reactor模型的实现方式 单Reactor单线程模型所有操作连接、读写由一个线程完成。设计简单但在高并发场景下容易成为性能瓶颈。 单Reactor多线程模型Reactor线程负责监听和分发事件而事件的处理则交给线程池中的工作线程完成。这种方式能够充分利用多核CPU的处理能力但在高并发场景下Reactor线程可能成为性能瓶颈。 主从Reactor多线程模型Netty 默认模型-高并发也称为多Reactor多线程模型。主Reactor线程负责监听和分发连接事件当有新的连接到来时将其分发给从Reactor线程处理。从Reactor线程负责监听和分发读写事件并交给线程池中的工作线程处理。这种方式能够进一步提高系统的并发处理能力和可扩展性。 写个netty服务端示例看一下 // 1. 创建主 Reactor处理连接管理一组 EventLoop每个线程绑定一个 EventLoop事件循环线程 EventLoopGroup bossGroup new NioEventLoopGroup(1); // 主线程组通常 1 个线程 // 2. 创建子 Reactor处理 I/O EventLoopGroup workerGroup new NioEventLoopGroup(); // 子线程组默认 CPU 核数 × 2//Reactor 模式配置入口 绑定主/子线程组、设置 Channel 类型 ServerBootstrap server new ServerBootstrap(); server.group(bossGroup, workerGroup) // 绑定主从线程组.channel(NioServerSocketChannel.class) // 设置 Channel 类型NIO代表一个 Socket 连接或监听端口.childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new ServerHandler()); // 添加业务处理器这里需要自己实现}});// 3. 绑定端口并启动服务 ChannelFuture future server.bind(8080).sync(); //等待服务器通道关闭 future.channel().closeFuture().sync(); //关闭通道 finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}//业务处理器 public class ServerHandler extends ChannelInboundHandlerAdapter {Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println(客户端连接成功...);}}组件说明 Channel: 在Netty中Channel是一个核心概念Channel提供了数据的读取和写入操作以及与远程端点进行通信的能力。 通过Channel可以获取到很多信息比如本地地址、远程地址、Channel的EventLoop、Channel的Pipeline等。 Channel 生命周期 channelRegistered 初始化操作→ channelActive 连接→ channelRead数据接收 → channelInactive断开→ channelUnregistered注销 Selector: Selector是Java NIONew Input/Output中的一个核心组件用于监控多个Channel通道的状态例如连接、读、写等事件。在netty中Selector被封装在NioEventLoop中当Channel注册到Selector并指定感兴趣的事件类型如连接、读、写等后会返回一个SelectionKey用于表示Selector与Channel之间的关联关系。Selector会不断地轮询其注册的Channel如果有事件发生Selector会将相应的SelectionKey放入就绪事件集合中。事件循环线程会从就绪事件集合中取出SelectionKey并根据事件类型调用相应的ChannelHandler进行处理。处理完成后事件循环线程会将Channel放回到Selector中继续等待下一次事件的发生。 EventLoopGroup 管理一组 EventLoop通常分为 bossGroup处理连接和 workerGroup处理 I/O。 配置线程数new NioEventLoopGroup(4) 表示 4 个线程。 ServerBootstrap 用于启动服务器端的引导类配置服务器参数和处理器链配置、启动服务器、关闭服务器。 配置服务器参数 线程模型ServerBootstrap允许您配置两个主要的线程组bossGroup和workerGroup。 bossGroup用于处理客户端的连接请求而workerGroup用于处理已连接的客户端的I/O操作。 通道类型通过channel方法您可以指定服务器使用的通道类型。对于NIO传输通常使用NioServerSocketChannel。 通道选项使用option方法可以设置服务器通道的选项如SO_BACKLOGTCP连接请求的最大队列长度和SO_REUSEADDR允许地址重用。 子通道选项childOption方法用于设置已连接客户端的通道选项如SO_KEEPALIVE保持连接活动状态。 Option可以应用于Channel或Bootstrap上。 ChannelOption专门用于配置Channel的参数。 处理器链配置 父处理器通过handler方法您可以设置处理服务器通道I/O事件的处理器。这通常用于处理连接请求。 子处理器childHandler方法用于设置处理已连接客户端I/O事件的处理器。这是开发者编写业务逻辑处理代码的地方通常通过添加一系列的ChannelHandler来实现。 ChannelHandler ChannelHandler是ChannelPipeline中的基本处理单元负责处理或拦截入站和出站事件。每个ChannelHandler都有一个关联的ChannelHandlerContext通过它可以方便地与其他组件进行交互。ChannelPipeline则是ChannelHandler的容器负责ChannelHandler的管理和事件拦截。 pipeline、ChannelPipeline Pipeline是ChannelPipeline的简称。ChannelPipeline用于处理网络事件和数据的流动。负责将一系列的处理逻辑称为ChannelHandler串联起来形成一个处理链对网络事件进行拦截和处理。 事件处理ChannelPipeline负责处理入站Inbound和出站Outbound事件如数据读取、数据写入、连接建立、连接断开等。 拦截器链ChannelPipeline内部维护了一个拦截器链或称为处理器链每个拦截器即ChannelHandler都可以对事件进行处理或拦截。 动态性ChannelPipeline允许在运行时动态地添加、删除或替换拦截器从而灵活地扩展和定制网络处理逻辑。 启动服务器 配置完成后通过调用bind方法并传入服务器的端口号ServerBootstrap将启动服务器并绑定到指定的端口。 bind方法返回一个ChannelFuture对象您可以使用sync方法等待服务器启动完成。 ChannelFuture是Netty框架中特有的接口继承自Java的Future接口。在Netty中所有的I/O操作都是异步的ChannelFuture用于在操作完成时通知应用程序以便应用程序可以执行某些操作或检索操作的结果。 关闭 当服务器需要关闭时可以调用ChannelFuture对象的channel().closeFuture().sync()方法等待服务器通道关闭。 最后调用bossGroup和workerGroup的shutdownGracefully方法以优雅地断开连接并关闭线程组。 ChannelHandlerContext ChannelHandlerContext封装了Channel和ChannelPipeline使得ChannelHandler可以方便地访问和操作ChannelPipeline和Channel。 ChannelHandlerContext提供了许多方法用于操作和传播事件如写入数据、刷新数据、触发读事件等。 ChannelHandlerContext允许ChannelHandler将事件传递给ChannelPipeline中的下一个处理器。例如当一个入站事件如数据读取发生时ChannelHandlerContext可以调用fireChannelRead方法将事件传递给下一个入站处理器。
http://www.dnsts.com.cn/news/143475.html

相关文章:

  • 网站推广如何做的广州手机网站建设联系电话
  • 沈阳手机网站开发成都营销型网站建设
  • 解析域名后怎么弄网站北京网络安全大会
  • 黄埔网站开发公司网站的代运营
  • 建设商务网站的费用织梦网站怎样入侵
  • 网站关键词怎么做排名建网站平台 优帮云
  • 苏州网站建设专业的公司科技志愿信息平台
  • 网站建设工具公司重庆网站seo公司哪家好
  • 茶叶网站建设一般的风格如何做房地产微信推送网站广告
  • 做平面常用的网站单仁做的网站
  • 网站设计建设,网络营销推广做家居网站
  • 湖北省住房部城乡建设厅网站首页软件开发定制图片
  • 做化妆招生宣传在那些网站可以做云南建网站的公司
  • 织梦网站建设流程建设网站的群
  • 翼城网站建设中山环保骏域网站建设专家
  • 网站如何做进一步优化jsp做网站用什么封装字符串
  • 网站seo优化方法查询网站相关网址
  • 网站后台程序设计常用语言 技术的分析比较成立网站开发公司
  • 经典网站设计风格哈尔滨网站建设唯辛ls15227
  • wordpress 获取作者id灰色行业seo
  • 旅游网站的设计栏目最新中国企业500强名单
  • 建设网站方式有哪些品牌策划书案例
  • 18款禁用网站app入口西部网站管理助手
  • 营销型网站设计论文最全的百度网盘搜索引擎
  • 门户网站改版方案网站被黑解决方案
  • 企业网站的结构以及内容.郑州网站建设技术托管
  • 1营销型网站建设电商网站运营
  • 自己电脑上做网站怎么使用源码网站建设哈尔滨
  • 个人网站备案 名称山西招标网
  • 深圳做网站公司那家比较好网站开发流程注意事项