文章目录

  • I/O模型的定义
  • BIO
    • Demo Server
    • Demo Client
    • Demo Run
  • BIO 同步阻塞模型
  • 小结


I/O模型的定义

什么是I/O模型呢? 简单来说就是说用什么样的通道进行数据的发送和接收。

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


BIO

Demo Server

package com.artisan.iomodel.bio;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/1/16 22:23* @mark: show me the code , change the world*/
public class SocketServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(7777);while (true) {System.out.println("等待client连接....");//阻塞方法Socket clientSocket = serverSocket.accept();System.out.println("已收到客户端的连接....,开始处理");handler(clientSocket);/*new Thread(new Runnable() {@Overridepublic void run() {try {handler(clientSocket);} catch (IOException e) {e.printStackTrace();}}}).start();*/}}private static void handler(Socket clientSocket) throws IOException {byte[] bytes = new byte[1024];System.out.println("准备读取客户端发送来的数据");//接收客户端的数据,阻塞方法,没有数据可读时就阻塞int read = clientSocket.getInputStream().read(bytes);System.out.println("读取ing");if (read != -1) {System.out.println("接收到客户端的数据:" + new String(bytes, 0, read));}// 向服务端发送数据clientSocket.getOutputStream().write("HelloClient".getBytes());// 缓冲区刷新clientSocket.getOutputStream().flush();}
}

Demo Client

package com.artisan.iomodel.bio;import java.io.IOException;
import java.net.Socket;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/1/16 22:27* @mark: show me the code , change the world*/
public class SocketClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 7777);//向服务端发送数据socket.getOutputStream().write("HelloServer".getBytes());socket.getOutputStream().flush();System.out.println("向服务端发送数据结束");byte[] bytes = new byte[1024];//接收服务端回传的数据socket.getInputStream().read(bytes);System.out.println("接收到服务端的数据:" + new String(bytes));socket.close();}
}

Demo Run

启动 Server,

然后启动Client

同时看下Server的数据

我们用cmd工具来连一下 , telnet 127.0.0.1 7777

回车,输入 ctrl + ]

作为客户端发送消息

查看server是否收到


BIO 同步阻塞模型

通过上面的例子,可以看到 一个客户端连接对应一个处理线程

上面的线程模型 可以看到 只有一个main线程在处理,如果当前main线程没有处理完,后,后面的请求是无法被处理的 。


当然了我们上面的是一个线程的, 也可以改造为多线程 。

new Thread(new Runnable() {@Overridepublic void run() {try {handler(clientSocket);} catch (IOException e) {e.printStackTrace();}}}).start();

就变成了下面这种模式


小结

缺点显而易见

  • read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源
  • 每个请求都需要开辟一个线程去处理,开辟过多的线程势必会导致服务器资源紧张。

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


Netty - I/O模型之BIO相关推荐

  1. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )

    文章目录 I . Netty 简介 II . Netty 应用场景 III . Java I/O 模型 IV . BIO 概念 V . BIO 开发流程 VI . BIO 实例 VII . BIO 模 ...

  2. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  3. Netty之线程模型

    Reactor 线程模型: Reactor 是反应堆的意思,Reactor 模型是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式.服务端程序处理传入多路请求,并将它们同步分派给请 ...

  4. 计网 - 网络 I/O 模型:BIO、NIO 和 AIO 有什么区别?

    文章目录 Pre I/O 的编程模型 数据的传输和转化成本 数据结构运用 缓冲区 I/O 多路复用模型 总结 QA BIO.NIO 和 AIO 有什么区别? I/O 多路复用用协程和用线程的区别? P ...

  5. 面试官:Netty的线程模型可不是Reactor这么简单

    笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...

  6. Netty Reactor线程模型与EventLoop详解

    本文来说下Netty Reactor线程模型与EventLoop 文章目录 EventLoop事件循环 任务调度 线程管理 线程分配 非阻塞传输 阻塞传输 Netty线程模型 单Reactor单线程模 ...

  7. OSI网络模型,IO模型,BIO模型,NIO模型,AIO模型,TCP/IP协议

    文章目录 一.OSI网络模型 1.1.网络的7层架构 1.1.1.七层架构的网络图 1.1.2 七层架构的功能和作用 1.物理层 2.数据链路层 3.网络层 4.传输层 5.会话层 6.表示层 7.应 ...

  8. Java IO模型:BIO NIO AIO及netty介绍

  9. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...

最新文章

  1. 零基础学python需要多久-零基础学习Python开发需要多长时间?
  2. WebLogic安装Linux centos7
  3. 数据库范式(1NF 2NF 3NF BCNF)详解
  4. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
  5. 【已解决】wordpress文章页面如何去掉特色图像
  6. 三菱FX1S PLC控制伺服电机小结
  7. 正则表达式(一):php常用的正则匹配
  8. 用单片机控制单色显示屏
  9. Coding 码市:携手开发者与创业者,重新定义软件外包
  10. servlet+mysql实现的学生评教系统(角色:学生、教师、管理员 功能:评教、修改密码、评教规则管理、评教结果查看、学生管理、教师管理、班级管理、学生信息、评教结果可视化展示等)
  11. pg数据库百分比处理
  12. vs2010中的Resource View和Class View都为空的有效解决办法
  13. win10开启自带的手机投屏功能方式
  14. pytesseract 测试获取查策网编码字体
  15. Java 年轻代、年老代、GC
  16. 数学不好,可以当程序员么?
  17. win7电脑读不出u盘解决方法
  18. SOA部署:反常道而行之
  19. stm32F103RCT6串口ttl烧录代码手把手教学
  20. java new url()_Java(4)URL - SegmentFault 思否

热门文章

  1. matlab路面,赛道道路路况分析问题 matlab高手进下
  2. c++ 交换变量实践
  3. AttributeError: module ‘grpc.experimental.aio‘ has no attribute ‘StreamUnaryCall‘
  4. Python 如何优雅的将数字转化为时间格式
  5. tensorflow 最小二乘拟合详细代码注释
  6. Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)
  7. 点云网络的论文理解(七)-Frustum PointNets for 3D Object Detection from RGB-D Data
  8. 对比学习系列论文SDCLR(二)-Self-Damaging Contrastive Learning
  9. Python应用实战-在Python中进行数据处理操作的几种方法
  10. django权限系统实现步骤_Django权限机制的实现