BIO和NIO编程(待完善)

目录

IO模型

BIO

NIO

常见问题


IO模型

Java共支持3种网络编程IO模式:BIO,NIO,AIO

BIO

同步阻塞模型,一个客户端连接对应一个处理线程

代码示例:

 Server端:

public class BioServer {private static ExecutorService executorService = Executors.newFixedThreadPool(10);public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务器启动成功");while (true) {Socket socket = serverSocket.accept();System.out.println("客户端连接成功");executorService.execute(() -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {String message;while ((message = reader.readLine()) != null) {System.out.println("收到消息: " + message);writer.write("已收到消息: " + message);writer.newLine();writer.flush();}} catch (IOException e) {e.printStackTrace();}});}}
}

Client端:

public class BioClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 8888);BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));String message;while ((message = consoleReader.readLine()) != null) {writer.write(message);writer.newLine();writer.flush();System.out.println("发送消息: " + message);System.out.println("收到回复: " + reader.readLine());}socket.close();}
}

执行结果:

存在问题:

  • IO操作是阻塞操作, 连接时读写会造成线程阻塞
  • 线程太多会造成CPU异常

应用场景:

        BIO 方式适用连接数较小且固定的架构, 这种方式对服务器资源要求比较高, 但代码简单易理解。

NIO

        同步非阻塞,服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到多路复用器selector上,多路复用器轮询到连接有IO请求就进行处理,JDK1.4开始引入。

应用场景:

        NIO方式适用于连接数目多且连接比较短(轻操作) 的架构, 如聊天服务器, 弹幕系统, 服务器间通讯,编程比较复杂。

代码

public class BioSelectorServer {public static void main(String[] args) throws IOException {ServerSocketChannel serverSocket = ServerSocketChannel.open();serverSocket.socket().bind(new InetSocketAddress(9000));// 设置非阻塞serverSocket.configureBlocking(false);// 创建多路复用器Selector selector = Selector.open();// 注册serversocket到selector, 关注连接事件serverSocket.register(selector, SelectionKey.OP_ACCEPT);System.out.println("服务启动成功");while (true) {// 阻塞等待需要处理的事件selector.select();Set<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();// 如果是连接事件  > 获取连接并且注册读事件if (key.isAcceptable()) {ServerSocketChannel server = (ServerSocketChannel) key.channel();SocketChannel socketChannel = server.accept();socketChannel.configureBlocking(false);socketChannel.register(selector, SelectionKey.OP_READ);System.out.println("客户端连接成功");} else if (key.isReadable()) {SocketChannel socketChannel = (SocketChannel) key.channel();ByteBuffer byteBuffer = ByteBuffer.allocate(128);int len = socketChannel.read(byteBuffer);if (len > 0) {System.out.println("接收到消息:" + new String(byteBuffer.array()));} else {System.out.println("客户端断开连接");socketChannel.close();}}// 从事件集合里删除本次处理的key,防止下次select重复处理iterator.remove();}}}
}

NIO的三大核心组件:

  1. channel 类似于流,每个 channel 对应一个 buffer缓冲区,buffer 底层就是个数组
  2. channel 会注册到 selector 上,由 selector 根据 channel 读写事件的发生将其交由某个空闲的线程处理
  3. NIO 的 Buffer 和 channel 都是既可以读也可以写

常见问题

为什么Netty使用NIO而不是AIO?        

        在Linux系统上,AIO的底层实现仍使用Epoll,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层,不容易深度优化,Linux上AIO还不够成熟。Netty是异步非阻塞框架,Netty在NIO上做了很多异步的封装。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/317025.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学到了!3步get微信自动回复

你是不是也有过这样的烦恼&#xff1a;因为忙碌或是消息太多&#xff0c;没能及时回复好友消息&#xff0c;尤其是在休息、节假日的时候。 今天就给大家种草一款能够让微信自动回复消息的神器——微信管理系统&#xff0c;让你再忙碌也能及时回复好友&#xff01;而且操作也不…

通过智能钱包监控降低加密交易费用

作者&#xff1a;stellafootprint.network 随着加密货币的普及&#xff0c;交易费用已成为一个不容忽视的问题。网络拥堵和 Gas 费的价格战&#xff0c;导致交易费用波动&#xff0c;严重影响了用户的预算。但是&#xff0c;通过智能钱包监控&#xff0c;我们可以有效降低交易…

欢迎提交pr共同改进项目, pr的含义?

"提交PR"在软件开发和编程领域是一个常用术语&#xff0c;特别是在使用版本控制系统如Git时。这里的“PR”指的是“Pull Request”&#xff0c;它是一种通知项目维护人员您已经完成了一些代码改动并希望将这些改动合并到主项目中的方式。简单来说&#xff0c;当您对一…

PACS源码,数字化影像信息系统源码,带三维影像后处理技术

全院医学影像PACS源码&#xff0c;数字化影像信息系统源码&#xff0c;带三维影像后处理技术 全院影像设备联网与影像信息数字化存储&#xff0c;建立涵盖全院的PACS/RIS系统&#xff0c;实现从预约、登记、分诊、排队叫号、检查、诊断阅片、报告发布、自助胶片打印等流程化管…

Acrel-EIoT能源物联网云平台助力电力物联网数据服务 ——安科瑞 顾烊宇

摘要&#xff1a;Acrel-EIOT能源物联网云平台是一个结合在线销售的互联网商业模式&#xff0c;为分布广泛的互联网用户提供PAAS服务的平台。安科瑞物联网产品安装完成后&#xff0c;用户可以通过手机扫描代码轻松实现产品访问平台&#xff0c;无需注意调试和平台运行过程&#…

8295座舱首家量产/连续两款车型落地,智能座舱进阶3.0时代

兼具豪华感与科技感的数字座舱&#xff0c;已经成为当前各大高端智能车型的核心卖点。 在2023年广州车展上&#xff0c;高端智能纯电轿车吉利银河E8正式发布&#xff0c;极具科技感的座舱空间设计与智能化能力让这款车脱颖而出。 例如极具视觉震撼效果的45英寸贯穿屏&#xff…

github短视频去除水印项目Douyin_TikTok_Download_API介绍

当下正值短视频盛行的时代。在我们浏览短视频的同时&#xff0c;经常能发现一些精美的图片、引人入胜的文案以及吸引眼球的视频&#xff0c;想要将它们保存到本地。然而&#xff0c;保存下来的图片或视频通常伴随着不太愉悦的水印&#xff0c;这显著降低了使用体验。因此&#…

STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片&#xff0c;采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集&#xff0c;MQ-7一氧化碳传感器检测CO浓度&#xff0c;GP2Y101…

系列九、Feign

一、Feign 1.1、Java中如何实现跨接口调用 &#xff08;1&#xff09; Httpclient Httpclient是Apache Jakarta Comon下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包&#xff0c;并且它支持HTTP协议的最新版本和建议。HttpC…

摆烂式学习ssh

摆烂式学习ssh ssh工作原理ssh基本使用sshd配置文件密钥登录1.客户端2.服务器3.注意事项4.使用密钥登录测试 ssh高级使用技巧1.在非正规端口启动2.rsync 命令3.透过 ssh 通道加密原本无加密的服务4.以ssh信道配合x server 传递图形接口5.ssh配合virtualbox虚拟机使用技巧 ssh工…

【输入npm install express出现的报错】

目录 输入&#xff1a;npm install express&#xff0c;出现如下的报错 分析原因 方法1&#xff1a;用管理员的身份进行安装 方法2&#xff1a;更改文件夹的权限 输入&#xff1a;npm install express&#xff0c;出现如下的报错 分析原因&#xff1a; npm在执行安装过程中…

为什么要太空探索?未来万亿人口 人类移居太空是不可避免的。大语言模型是发现 贝索斯

管理的思考 「最以客户为中心」「果断」「如何决策」 贝索斯给亚马逊的使命是「世上最以客户为中心的公司」(以客户需求为起点&#xff0c;反向推动工作)。贝索斯给蓝色起源的使命是「世上最果断的公司」(我们将变得非常擅长在技术上恰当地冒险&#xff0c;并快速地作出那些决…