同步阻塞IO模型
同步阻塞IO模型
有上篇IO模型中的,同步阻塞IO模型,我们能够知道,用户线程发起请求后就一直阻塞的等待
内核完成准备数据、数据拷贝的工作。并且返回成功的指示。
实现
使用java来实现同步阻塞IO模型,即我们所说的BIO的模型
客户端实现
/**
* @author:triumphxx
* @Date:2021/10/12
* @Time:10:29 下午
* @微信公众号:北漂码农有话说
* @网站:http://blog.triumphxx.com.cn
* @GitHub https://github.com/triumphxx
* @Desc: BIO网络编程模型客户端
**/
public class BIOClient {
public static void main(String[] args) {
try {
//连接服务端
Socket socket = new Socket("localhost",9000);
//准备给服务端发送的信息
socket.getOutputStream().write("hello server".getBytes());
//开始发送信息
socket.getOutputStream().flush();
System.out.println("客户端信息发送完成");
byte[] bytes = new byte[1024];
socket.getInputStream().read(bytes);
System.out.println("服务端返回的信息为:"+new String(bytes));
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
由代码可以看出来,客户端的代码非常简单,即建立连接、发送信息、接收信息
服务端实现
/**
* @author:triumphxx
* @Date:2021/10/12
* @Time:10:29 下午
* @微信公众号:北漂码农有话说
* @网站:http://blog.triumphxx.com.cn
* @GitHub https://github.com/triumphxx
* @Desc: BIO网络编程模型服务端
**/
public class BIOServer {
public static void main(String[] args) throws IOException {
//创建一个Socket服务
ServerSocket serverSocket = new ServerSocket(9000);
//创建线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//服务端启动后等待着客户端的请求
while (true){
System.out.println("等待连接");
//阻塞的方法,等待连接
final Socket socket = serverSocket.accept();
System.out.println("有客户端的连接进来了");
//BIO的特点,每进来一个客户端的请求都需要创建线程去处理
executorService.execute(new Runnable() {
@Override
public void run() {
dealMessage(socket);
}
});
}
}
public static void dealMessage(Socket socket) {
System.out.println("线程名称为" + Thread.currentThread().getName());
System.out.println("开始读取信息");
try {
byte[] bytes = new byte[1024];
InputStream inputStream = socket.getInputStream();
inputStream.read(bytes);
System.out.println("接收到客户端的信息为:"+new String(bytes));
socket.getOutputStream().write("客户端你好,接收到了你的信息".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
有服务端的代码,我们可以看到,服务端每接收一个请求就得线程池分配一个线程去处理这个请求。
每一行代码的意思,作者都已经进行表明。
优点及缺点
优点:编程模型简单
缺点:需要大量线程,可靠性差,吞吐量差,阻塞
适用场景
适用于连接比较少且比较固定的场景,编程模型最简单
小结
以上就是java的BIO编程模型,很简单的一个小例子,希望对你有所帮助。代码传送门

同步阻塞IO模型的更多相关文章
- PHP stream 学习笔记一(同步阻塞 IO 模型)
原文http://blog.csdn.net/shagoo/article/details/6396089 [root@localhost php]# vi server_one.php <?p ...
- NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】
1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...
- 异步IO比同步阻塞IO性能更好吗?为什么?
最近在看node.js, 介绍中提到node是异步io的方式实现, 性能比同步阻塞io的更好. 对于一个request而言, 如果我们依赖io的结果, 异步io和同步阻塞io都是要等到io完成才能继续 ...
- Python之阻塞IO模型与非阻塞IO模型
Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...
- 网络IO模型 非阻塞IO模型
网络IO模型 非阻塞IO模型 同步 一件事做完后再做另一件事情 异步 同时做多件事情 相对论 多线程 多进程 协程 异步的程序 宏观角度:异步 并发聊天 阻塞IO 阻塞IO的问题 一旦阻塞就不能做其他 ...
- 多路复用 阻塞/非阻塞IO模型 网络IO两个阶段
1.网络IO的两个阶段 waitdata copydata send 先经历:copydata阶段 recv 先经历:waitdata阶段 再经历 copydata阶段 2.阻塞的IO模型 之前写的都 ...
- python 之 并发编程(非阻塞IO模型、I/O多路复用、socketserver的使用)
9.16 非阻塞IO模型 cpu占用率过高 服务端: from socket import * import time s = socket() s.bind(('127.0.0.1',8080)) ...
- IO模型,非阻塞IO模型,select实现多路复用
1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...
- python 并发编程 非阻塞IO模型
非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...
随机推荐
- Ubuntu 16.04 curl 安装 使用
curl是利用URL语法在命令行方式显工作的开元文件传输工具. 安装 $ sudo apt install -y curl 使用 $ curl http://www.baidu.com 这是最简单的使 ...
- 并发编程从零开始(十四)-Executors工具类
并发编程从零开始(十四)-Executors工具类 12 Executors工具类 concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池 12.1 四种对比 单线程 ...
- sudo user1账号获得管理员root的权限
user1虽然有sudo权限,但不是真正的root权限,修改内核参数之类的就做不了 但是有sudo权限就可以添加账号,以下添加了admin账号与root账号一样的权限 useradd -u 0 - ...
- namespace之cgroup
Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Namespace把我J ...
- adb 安装与使用(一)
一.ADB简介 1. 什么是adb? adb(Android Debug Bridage)是Android sdk的一个工具: adb 是用来连接安卓手机和PC端的桥梁,要有adb作为二者之间的维系, ...
- 模块化开发 | es6模块暴露与引入
CommonJS模块开发 CommonJS定义 每个文件就一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. 私有作用域不会污染全局作用域. 模块可加载多次, ...
- 【完虐算法】LeetCode 接雨水问题,全复盘
大家好! 动态规划题目是总结的比较完整了.下面是自从和大家刷开题总结的动态规划解题方法. 今年全国夏天雨是真的多,突然想到今年北京的夏天也不像往年那么热.不知不觉就稳稳地度过了夏天来到秋天. 恰巧前几 ...
- 大爽Python入门教程 1-4 习题
大爽Python入门公开课教案 点击查看教程总目录 1 [思考]方向变换 小明同学站在平原上,面朝北方,向左转51次之后(每次只转90度), 小明面朝哪里?小明转过了多少圈? (360度为一圈,圈数向 ...
- 【拥抱元宇宙】创建你的第一个Unity程序HelloWorld,并发布
第一个Unity程序--Hello World. 1.需要先下载一个Unity Hub,以及安装Unity编辑器.Unity Hub需要登陆,激活码可以选择个人用户,免费的.免费的无法改变启动画面,其 ...
- [bzoj1077]天平
先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA- ...