一、I/O模型之BIO
I/O模型之BIO
基本介绍
- Java BIO 就是传统的 Java IO 编程,其相关的类和接口再 java.io 包下
- BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,但是如果新启动的这一个线程不做任何事情就会造成不必要的开销,可以通过线程池机制改善
- BIO 模型适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发性能差,JDK1.4以前使用
BIO编程的流程
- 服务器端启动一个SeverSocket
- 客户端启动Socket对服务器端进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通讯
- 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待或者被拒绝
- 如果服务器有响应,客户端当前线程会等待请求结束后才继续执行
应用实例
实例说明
- 使用BIO模型编写一个服务器端,监听6666端口,当有客户连接时,就启动一个线程与之通讯
- 要求使用线程池机制改善,可以连接多个客户端
- 服务器端可以接收客户端发送的数据(使用telnet)
实例代码:
public class BIOServer {
public static void main(String[] args) throws Exception {
//1、创建一个线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动了!!!");
while (true){
//监听,等待客户端连接
final Socket socket = serverSocket.accept();
System.out.println("连接到一个客户端");
//2、如果有客户端连接了,就创建一个线程,与之通讯(单独写一个方法)
threadPool.execute(new Runnable() {
public void run() {
//与客户端进行通讯
handler(socket);
}
});
}
}
//编写一个与客户端通讯的handler方法
public static void handler(Socket socket){
//用于接收数据
byte[] bytes = new byte[1024];
//通过socket获取输入流
InputStream inputStream = null;
try {
System.out.println("线程id="+Thread.currentThread().getId()+"名字="+Thread.currentThread().getName());
inputStream = socket.getInputStream();
//循环读取客户端发送的数据
while(true){
int read = inputStream.read(bytes);
if (read!=-1){
//输出客户端发送的数据
System.out.println(“收到信息:”+new String(bytes,0,read));
}else{
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
System.out.println("关闭与客户端的连接......");
try {
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试结果:
服务器启动了!!!
连接到一个客户端
线程id=12名字=pool-1-thread-1
收到消息:nihao
一、I/O模型之BIO的更多相关文章
- Java IO模型:BIO、NIO、AIO
Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...
- I/O模型之四:Java 浅析I/O模型(BIO、NIO、AIO、Reactor、Proactor)
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- IO模型之BIO代码详解及其优化演进
一.BIO简介 BIO是java1.4之前唯一的IO逻辑,在客户端通过socket向服务端传输数据,服务端监听端口.由于传统IO读数据的时候如果数据没有传达,IO会一直等待输入传入,所以当有请求过来的 ...
- Netty学习(1):IO模型之BIO
概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...
- 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO
前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- Java I/O模型从BIO到NIO和Reactor模式(转)
原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自技术世界,原文链接 http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 ...
- IO模型
前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...
- Java Se : Java NIO(服务端)与BIO(客户端)通信
Java目前有三种IO相关的API了,下面简单的说一下: BIO,阻塞IO,最常用的Java IO API,提供一般的流的读写功能.相信学习Java的人,都用过. NIO,非阻塞IO,在JDK1.4中 ...
随机推荐
- 使用vsCode配合IAR搭建arm开发环境
众所周知IAR的编辑功能就是个垃圾,但是不得不承认IAR的编译器相当的牛X,经常以稳定可靠而著称,为此我们把VSCODE强大的编辑功能和IAR结合一下来加快我们的开发周期. 一.下载VSCODE并安装 ...
- django基础之day04知识点----查询相关
from django.test import TestCase # Create your tests here. ''' 当你想单独测试django中某一个py文件时,你需要手动配置测试文件 在m ...
- TypeScript引入moment.js报错“无法找到moment模块”及解决方法
npm i moment下载moment完成后,在ts文件中引入 import * as moment from "moment"; 结果疯狂报错,未找到moment模块. 一开始 ...
- Hystrix集群及集群监控turbine
Hystrix集群及监控turbine 前面Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine. turbine是基于Dashboard的. 先搞个 ...
- 设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务
设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-02. 参考文章: IPv6"内网"设备 ...
- 记druid 在配置中心下的一个大坑: cpu 达到 100%
把我们的dubbo 应用移步到配置中心上去之后,发现我们的应用过一段时间就会出现cpu 100%的情况 (大概是12个小时),一开始cpu占用是2-5% 的样子,什么都没做,后面竟然用尽了cpu.. ...
- c语言从入门到精通的几个阶段
本文主要结合往期学员学习阶段,因材施教整理的几个阶段学习路线知识点: 1.初级教程 初级c语言入门教程比较适合零基础的小白,这个周期一般在22天,度过这个阶段的小白,基本上已经拥有了编程思维,且能开发 ...
- tornado框架中redis使用
一.安装依赖 pip3 install tornado-redis 二.导入模块 import tornadoredis 三.创建redis对象 import tornadoredis CONNECT ...
- HTML入门(html基本文本标签+快捷键讲解以及基本html组成解释)
id 标签 功能 1 <hr /> 水平分割线 2 <br /> 强制让文本换行 3 <p>段落</p> 段落标签(自带换行效果) 4 < ...
- HTML基础——基础标签
一.HTML概述 htyper text markup language 即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 标记语言: 标记(标签)构成的语 ...