同步阻塞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执行读操作时,流程是这个样子: 从图 ...
随机推荐
- Wedding DJ题解 (回归OI)
写在前面 高考结束了, 很遗憾, 我是其中的失败者, zzu, 没有想过最后来到这个学校, 并且还是信息安全专业, 不过, 时间久了, 也慢慢适应了: 当我被这个学校的这个专业录取, 也就注定着, 我 ...
- 启用或禁用普通用户Exchange Online PowerShell功能
默认情况下,允许在 Microsoft 365 中创建的所有帐户都可以使用 Exchange Online PowerShell.管理员可以使用 Exchange Online PowerShell ...
- linux 虚拟网络设备的使用
1. linux 常见虚拟网络设备分类 常见虚拟网络设备有:bridge, tun/tap, veth-pairs, macvlan, macvtap等.有一篇博文写的挺好的,图文并茂:虚拟网络设备, ...
- Java第三天【变量、常量、数据类型】
学习Java第三天!加油!请帖友看看有和不足的地方,和在下说一下,谢谢! 变量 变量(variable): 1.变量的本质就是代表"可操作的存储空间",空间位置是确定的,蛋里面放置 ...
- github上传和删除文件(三)
上传文件: git init git add * git commit -m "description" //git remote rm origin 或查看当前 git remo ...
- 04 | 函数扩展 | es6
函数参数的默认值 基本用法 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x ...
- webpack 之开发环境优化 HMR
webpack 之开发环境优化 HMR // webpack.config.js /** * HMR hot module replacement 热模块替换 / 模块热替换 * 作用:一个模块发生变 ...
- Java学习(十一)
今天学习了this和static关键字,这两个都是c++中学过的,但讲师还是讲了2个小时... 学得东西大部分都知道吧. this是当前对象的地址,类中带有static的方法不能使用this. 类中带 ...
- c++学习笔记3(动态内存分配)
为了效率,需要按需去进行动态内存分配,在c中,可以用malloc去实现动态内存分配,而在c++中,则用new运算符去实现. 用法一:动态分配一个变量的存储空间 p=new T T为类型名 P则为T*类 ...
- 要web开发精品教程吗?免费无广告一百期连讲的那种-逐浪CMS前端开发100期入门教程全面开放
要web开发精品教程吗?免费无广告一百期连讲的那种-逐浪CMS前端开发100期入门教程全面开放 大师主讲 经验难得 由逐浪CMS首席架构师发哥老师,亲自主理讲解. 历时一年精心打造, 汇聚了互联网诞生 ...