【JAVA基础】- BIO介绍及其使用

【JAVA基础】- BIO介绍及其使用

文章目录

  • 【JAVA基础】- BIO介绍及其使用
    • 一、BIO概述
    • 二、BIO工作机制
      • 客户端
      • 服务端
    • 三、同步阻塞步骤
    • 四、编码实现传统BIO
      • 服务端代码
      • 客户端代码
      • 总结
    • 五、BIO编程现实多发多收
      • 服务端代码
      • 客户端代码
    • 六、BIO模拟客户端服务端多对一
      • 实现步骤
      • 服务端实现
      • 客户端实现
      • 六、总结

一、BIO概述

BIO(Blocking I/O)是传统java io编程既同步阻塞IO,服务器实现模式为一个连接一个线程。客户端有连接请求时服务器端就会新起一个线程进行处理。当线程空闲时为减少不必要的线程开销,可以通过线程池机制改善。BIO方式适合用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限应用中。

二、BIO工作机制

在这里插入图片描述

  • 客户端

    1. 通过Socket对象请求与服务端建立连接。
    2. 从Socket中得到字节输入或者字节输出流进行数据读写操作。
  • 服务端

    1. 通过ServerSocket注册端口。
    2. 服务端通过调用accept方法用于监听客户端的Socket请求。
    3. 从Socket中得到字节输入或者字节输出流进行数据读写操作。

三、同步阻塞步骤

  1. 服务端启动一个ServerSocket
  2. 客户端启动Socket对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通讯。
  3. 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。
  4. 如果有响应,客户端线程会等待请求结束后,在继续执行。

四、编码实现传统BIO

  • 传统的同步阻塞模型开发中,服务端ServerSocket负责绑定IP地址,启动监听端口;客户端Socket负责 发起 连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。
  • 基于BIO模式下的通信,客户端-服务端是完全同步,完全藕合的。

服务端代码

 public static void main(String[] args) {System.out.println("===服务端启动===");ServerSocket serverSocket=null;try {serverSocket=new ServerSocket(5000);Socket socket=serverSocket.accept();InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String msg;if ((msg = br.readLine()) != null) {System.out.println("服务端接收客户端信息为:" + msg);}}catch (Exception exception){System.out.println(exception.getMessage());}}

客户端代码

public static void main(String[] args) {Socket socket = null;try {socket = new Socket("127.0.0.1",5000);OutputStream os = socket.getOutputStream();PrintStream ps = new PrintStream(os);ps.println("Hi BIO! 与服务端通信成功");ps.flush();} catch (IOException e) {e.printStackTrace();}}

总结

传统BIO服务端会一直等待客户端的消息,如果客户端没有进行消息的发送,服务端将一直进入阻塞状态,同时服务端是按照行获取消息的,这意味着客户端也必须按照行进行消息的发送,否则服务端将进 入等待消息的阻塞状态。

五、BIO编程现实多发多收

BIO简单方式是一个接收一个发送,如果实现多发多接收,下面将验证多发多收的代码

服务端代码

public static void main(String[] args) {System.out.println("===服务端启动===");try {ServerSocket ss = new ServerSocket(9988);Socket socket = ss.accept();InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String message;while ((message = br.readLine()) != null){System.out.println("服务端接收客户端信息为:" + message);}} catch (IOException e) {e.printStackTrace();}
}

客户端代码

public static void main(String[] args) {try {Socket socket = new Socket("localhost",9988);OutputStream os = socket.getOutputStream();PrintStream ps = new PrintStream(os);Scanner scanner = new Scanner(System.in);while (true){System.out.println("请输入:");String input = scanner.nextLine();ps.println(input);ps.flush();}} catch (IOException e) {e.printStackTrace();}
}

六、BIO模拟客户端服务端多对一

前面无论是一收一发,还是多发多收都仅限一个客户端,如何实现一个服务端对应多个客户端哪,这个主要是更改服务端代码

实现步骤

  1. 监听tcp端口
  2. while循环接收连接
  3. 对接收到的连接进行InputStream/OutputStream操作

服务端实现

  public void listen() throws IOException {ServerSocket serverSocket = null;try {log.info("服务启动监听");serverSocket = new ServerSocket(9988);//循环接收到客户端的连接while (true) {Socket socket = serverSocket.accept();//得到连接后,开启一个线程处理连接handleSocket(socket);}}finally {if(serverSocket != null){serverSocket.close();}}}
private void handleSocket(Socket socket) {HandleSocket socketHandle = new HandleSocket(socket);new Thread(socketHandle).start();
}
 public void run() {BufferedInputStream bufferedInputStream = null;BufferedOutputStream bufferedOutputStream  = null;try {bufferedInputStream = new BufferedInputStream(socket.getInputStream());byte[] bytes = new byte[1024];int len ;if ((len = bufferedInputStream.read(bytes)) > -1) {String result = new String(bytes,0,len);System.out.println("本次接收到的结果:"+result);}System.out.println("回复信息给客户端:");bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());String outString = Thread.currentThread().getName()+"接收到了";bufferedOutputStream.write(outString.getBytes());bufferedOutputStream.flush();System.out.println("回复完成:");} catch (IOException e) {System.out.println("异常:"e.getLocalizedMessage());} finally {System.out.println("关闭数据流:");try {if (bufferedInputStream != null) {bufferedInputStream.close();}if (bufferedOutputStream != null) {bufferedOutputStream.close();}}catch (IOException e){System.out.println("请输入:"e.getLocalizedMessage());}}}

客户端实现

1.与服务端建立连接

2.发送消息给服务端

3.接收服务端返回的消息

  public void start() throws IOException {Socket socket = new Socket("127.0.0.1", 8081);String msg = "Hi,This is the BioClient";//1.拿到输出流//2.对输出流进行处理System.out.println("请输入:"+msg);BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = msg.getBytes();//3.输出msgbufferedOutputStream.write(bytes);bufferedOutputStream.flush();System.out.println("发送完毕.");System.out.println("开始接收到消息.");//4.对输入流进行处理BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());byte[] inBytes = new byte[1024];int len;//5.读取输入流if ((len = bufferedInputStream.read(inBytes)) != -1) {String result = new String(inBytes, 0, len);System.out.println("接收到的消息="+result);}//6.关闭输入输出流bufferedOutputStream.close();bufferedInputStream.close();socket.close();}

六、总结

  • 每个Socket接收到,都会创建一个线程,线程的竞争、切换上下文影响性能;
  • 每个线程都会占用栈空间和CPU资源;
  • 并不是每个socket都进行lO操作,无意义的线程处理;
  • 客户端的并发访问增加时。服务端将呈现1:1的线程开销,访问量越大,系统将发生线程栈溢出, 线程创建失败,最终导致进程宕机或者僵死,从而不能对外提供服务;

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

39、传输层的任务和协议

从本节内容开始,我们学习TCP/IP模型的传输层的知识。传输层是TCP/IP模型中的重要组成部分,如果没有传输层的处理,那么源主机发送的IP数据包到达目的主机之后,目的主机将不知道这个数据是哪个应用程序的数据,就不能很好…

央行、外管局、银行业协会牵头银行区块链联盟,三驾马车齐攻国际金融市场...

文丨互链脉搏黑珍珠号 未经授权,不得转载! 11月20日,恒生电子股份有限公司官方消息,恒生电子区块链运营总监任珊日前表示,由中国银行业协会牵头,11家头部银行以及4家科技公司共同参与的“中国贸易金融跨行交易区块链平…

CDA数据分析师高级师资研修班在重庆仙桃大数据学院顺利开班

7月22日,由CDA数据分析(成都)研究院、重庆仙桃大数据学院联合筹备及招生的“CDA数据分析师高级师资研修班”在重庆仙桃大数据学院顺利开班。 本次培训由CDA数据分析(成都)研究院副院长、中科院博士、电子科技大学博士后卢宇老师主讲。分别从大数据系统架构、数据的导…

阿里巴巴区签约重庆,这些合作亮点你不得不知!

(原文标题:刚刚,阿里巴巴区域中心落地!马云来重庆要干这些大事情!) 马云携团队来重庆了,背后隐藏着大信息!显然是要干大事情! 就在刚刚,重庆市政府与阿里巴巴…

首批49个国家绿色数据中心名单公布

导读 工业和信息化部、国家机关事务管理局、国家能源局等三部门日前联合公告第一批国家绿色数据中心名单,世纪互联M6数据中心等49个数据中心榜上有名。 工 业 和 信 息 化 部 国 家 机 关 事 务 管 理 局 国  家  能  源  局 公  告 2018年…

【案例】重庆市金融工作办公室:大数据监测预警非法集资平台

近年来,随着国家对金融市场管控政策的不断调整以及互联网金融的快速发展,非法集资的犯罪手段和形势发生了很大变化。仅在2016年,全国检察机关公诉部门受理非法集资案件9500余件 作者 | 金信网银 官网 | www.datayuan.cn 微信公众号ID | datayuancn 本篇案…

1028万!重庆统计局招标大数据平台,开建统计数据中台

2022年9月15日,重庆市统计大数据平台(CQS22C01140)发布中标(成交)结果公告,如下: 项目编号 CQS22C01140 项目名称 重庆市统计大数据平台 服务范围 大数据已成为新型生产要素和国家基础性战略资源,积极发挥政…

税局端服务器未响应是什么意思,DNS服务器未响应是什么意思

DNS服务器未响应是指DNS服务器没有和你连接上,即不能从DNS服务器上获取数据。DNS服务的是安装了DNS服务器端软件的计算机,服务器端软件既可以是基于类linux操作系统,也可以是基于Windows操作系统的。 本教程操作环境:windows7系统…

读《Flask Web开发实战》(狼书)笔记 | 第1、2章

前言 2023-8-11 以前对网站开发萌生了想法,又有些急于求成,在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣,存在许多模糊或不太理解的地方,只会照葫芦画瓢。 而当自己想开发一个什么网站的时&…

Android 高手进阶教程(二)之----Android 数据库SQLiteDatabase的使用!!

直接进入主题~ Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences 存储;第三种就是数据库SQLiteDatabase 存储。 文件存储我就不用多说了,而SharedPreferences 可以存取简单的数据(int,double,float.etc),它经常…

SQL-每日一题【1484. 按日期分组销售产品】

题目 表 Activities: 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 结果表结果格式如下例所示。 示例 1: 解题思路 前置知识 group_concat函数的功能   将group by产生的…

傅盛:猎豹移动在三个领域取得进步 手游业务受政策影响不大

雷帝网 乐天 11月22日报道 猎豹移动(NYSE:CMCM)昨日发布截至2018年9月30日的第三季度财报,财报显示,猎豹移动Q3总收入13.52亿元,同比增长16%,环比增长23%,超过公司业绩指引上线。 猎豹移动手游业…

傅盛:猎豹持有猎户星空约34%股权 未来或获控股权

雷帝网 乐天 8月21日报道 猎豹移动董事长、CEO傅盛昨日在电话会议上表示,猎豹移动更加重视国内市场。过去,猎豹的海外工具及国内工具由不同团队运营。现在,由统一的团队运营管理。 “我们还将猎豹在海外验证的模式复制到国内。”傅盛说&#…

猎豹MFC--不使用向导

在CMyApp类的类视图下点属性 找到消息 添加找到InitInstance加进去 添加OnPaint消息 添加左键消息 自动生成的头文件信息: 在客户区大小内画椭圆文字 以上两张图先画线后画圆 CClientDC dc(NULL) 传NULL 为桌面 串this为当前窗口 来自为知笔记(Wiz) 转载于:https:…

中国工具类App折戟海外,为什么只有猎豹移动杀出血路?

移动互联网下半场中国市场人口红利不再,“走出去”成为互联网公司不约而同的选择,BAT、蚂蚁金服、摩拜、ofo、美图等公司都在出海。不过,中国互联网公司出海的历史却可以追溯到移动互联网早期,很早之前就出现了海外小三巨头&#…

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者,你是否拥有一款属于你自己的高逼格电脑桌面呢?你是不是也像大多数同学一样,会把所有的内容全部都堆积到电脑桌面,不仅找东西困难,由于桌面内容太多还会导致C盘空间不足,影响电脑的反…

【吐槽系列】如何用最贱蛋的方式将web程序变为桌面应用

#前言 实在是想吐个槽,最近公司有个活,想要将我们写的web网站套在一个浏览器壳子里面,愣装桌面应用(zhuang b)。然后健哥给我推荐了cef,顺道作者又手贱的去看了cefSharp和Xilium.CefGlue,不得不…

Java算法_ 杨辉三角(LeetCode_Hot100)

题目描述:题目描述:给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 获得更多?算法思路:代码文档,算法解析的私得。 运行效果 完整代码…

树莓派系统烧录,连接电脑,电脑远程桌面控制树莓派(树莓派无屏幕,校园网)

1、系统烧录 本人初学树莓派,没买屏幕,在学校里,用的是校园网,没有路由器,所以没办法直接通过网线连接树莓派和路由器,好让电脑能远程桌面控制树莓派,所以只能用迂回的方法,先让电脑…

猎豹创建快捷网页

猎豹创建快捷网页 IE创建快捷网页:http://blog.csdn.net/wangboxian/article/details/7431404 猎豹:将下面的绿钩拖到桌面上即可 posted on 2014-01-04 01:56 周永强 阅读( ...) 评论( ...) 编辑 收藏 转载于:https://www.cnblogs.com/zhouyongqiang/p/…