12.BIO详解

article/2025/3/17 18:51:45

Java BIO 就是传统的 java io 编程, 其相关的类和接口在 java.io 中.

BIO 编程简单流程

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

Java BIO 应用实例

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class BIOServer {public static void main(String[] args) throws Exception {ExecutorService executorService = Executors.newCachedThreadPool();ServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动");while (true) {// 监听, 等待客户端连接, 每一个 Socket 对象就是一个 客户端.final Socket socket = serverSocket.accept();System.out.println("一个客户端连接");// 创建线程与客户端通讯executorService.execute(() -> {try {InputStream inputStream = socket.getInputStream();while (true) {byte[] bytes = new byte[1024];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 {socket.close();} catch (IOException e) {e.printStackTrace();}}});}}
}

SocketInputStream

在上面的示例代码中, 要读取客户端发送的数据时, 需要先调用 socket.getInputStream() 方法获得输入流, 也就是在该方法内部调用 SocketImpl#getInputStream() , SocketImpl 是个抽象类, socket 通用超类用于创建客户端和服务器套接字.

该输入流对象就是 SocketInputStream, 它是 FileInputStream 的子类.
在这里插入图片描述
当调用 read(byte[]) 方法读取数据时, 最终会调用 socketRead0 这个本地方法.

该本地方法会根据是否设置了超时时间, 做不同的系统调用:

  • 有超时时间: 最终会在 for(;;) 中调用 select 方法(阻塞), 当超时, 失败或读到数据时候, 该方法会返回 0, -1或大于0的整数, 这个整数表示就绪描述符的数目. 当有数据可读的时候在调用 recv 函数非阻塞读取数据. 该函数的最后一个参数值为 MSG_DONTWAIT, 即非阻塞操作.
  • 没有超时时间: 这种情况比较简单, 直接调用以阻塞方式 recv 函数, 也就是最后一个参数值为 0.

上面是读, 下面说说写.

需要获得输出流, socket.getOutputStream().

OutputStream 中的 write(byte b[], int off, int len) 方法中也有限制, 每次只能写一个字节.

最终调用本地方法 socketWrite0, 在该方法中会以阻塞方式调用 send 方法写数据.

FileInputStream

  • 读数据: 调用 read 方法读数据时, 最终会调用该类中的 readBytes(byte b[], int off, int len) 本地方法, 该方法中会调用系统函数 read, 以阻塞形式读取指定长度的数据.
  • 写数据: 调用 write 方法写数据时, 最终会调用该类中的 writeBytes(byte b[], int off, int len, boolean append) 本地方法, 该方法中会调用系统函数 write 直接写指定长度数据.

需要注意我现在使用的 jdk 为:

openjdk version "1.8.0_252"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.252-b09, mixed mode)

Java BIO 问题分析

  1. 每个请求都需要创建独立的线程, 与对应的客户端进行数据连接 Read, 业务处理. 数据 Write.
  2. 当并发数较大时, 需要创建大量线程来处理连接, 系统资源占用较大.
  3. 连接创建后, 如果当前线程暂时没有数据可读, 则线程就阻塞在 Read 操作上, 造成线程资源浪费, 而且线程的阻塞和唤醒需要占用系统资源.

讨论

recv 方法可以读取任意长度的字节, 为什么在 Java 中要规定每次只读一个字节?

首先限制每次只读取一个字节是在 InputStream 抽象类中的 read(byte b[], int off, int len) 方法限制的.

        int c = read();if (c == -1) {return -1;}b[off] = (byte)c;int i = 1;try {for (; i < len ; i++) {c = read();if (c == -1) {break;}b[off + i] = (byte)c;}} catch (IOException ee) {}

如果返回 -1 就说明已经读完数据了, 如果不是 -1 就将数据添加到传进来的 byte[] 数组中.

至于为啥要这样, 我个人认为和 & 0xff 有关.

参考文章

JavaIO原理剖析之 网络IO


http://chatgpt.dhexx.cn/article/uH3eFQrt.shtml

相关文章

bioinformatics小技巧

文章目录 1. 软件安装1.1 linux上python2的安装1.2 Mercurial 安装及使用1.3 tRNAscan的安装和使用1.4 Linux上安装miniconda 2.数据下载2.1 linux上通过ftp下载一个文件夹下的全部文件2.2 GEO数据库数据下载 3.操作系统3.1 Windows下将R设置为环境变量。3.2 Linux 下怎样快速查…

brat标注的ann文件,转为BIO序列标注

这个地方真的好少有人写到&#xff0c;踩了好久的坑都不知道怎么解决。 首先&#xff0c;在用brat自带的转换序列标注的文件时&#xff0c;运行程序 1、python2 anntoconll.py ../data/data_new/corpoa.txt 报错&#xff1a; File "anntoconll.py", line 154, in…

BIO学习笔记

视频地址&#xff1a;https://www.bilibili.com/video/BV1gz4y1C7RK?fromsearch&seid15021234423448500976 2. JAVA BIO深入剖析 Java BIO 就是传统的 java io 编程&#xff0c;其相关的类和接口在 java.io。 BIO(blocking I/O) &#xff1a; 同步阻塞&#xff0c;服务器…

BIO实例

使用 BIO 模型编写一个服务器端&#xff0c;监听 6666 端口&#xff0c;当有客户端连接时&#xff0c;就启动一个线程与之通讯。要求使用线程池机制改善&#xff0c;可以连接多个客户端.服务器端可以接收客户端发送的数据(telnet 方式即可)。 图 代码演示&#xff1a; package…

利用 bioconda 管理生物信息软件

利用 bioconda 管理生物信息软件 如需视频讲解&#xff0c;请移步&#xff1a;一只小蛮要 【要知道 bioinfo】利用 bioconda 管理生物信息软件 1 了解 conda&#xff0c;anaconda&#xff0c;miniconda&#xff0c;bioconda 1.1 conda conda是一个软件模块管理工具&#xff…

IMex和IntAct数据库简介

欢迎关注微信公众号《生信修炼手册》! 蛋白质相互作用的数据库非常的多&#xff0c;比如DIP, MINT, IntAct, BioGRID等&#xff0c;不同数据库中的信息存在了大量的冗余&#xff0c;而且在不同数据库之间进行检索也非常的费力&#xff0c;为了减少不同数据库的冗余&#xff0c…

【Bio】基础生物学 - 基因 gene

文章目录 1. DNA 脱氧核糖核酸、RNA 核糖核酸1.1 核苷酸1.2 脱氧核糖核酸1.3 核糖核酸 2. 基因2.1 基因组2.2 染色体2.3 基因与脱氧核苷酸的牵连2.4 基因与DNA的牵连2.5 基因与染色体的牵连 Ref 1. DNA 脱氧核糖核酸、RNA 核糖核酸 1.1 核苷酸 核苷酸 (Nucleotide) \blue{\tex…

Bioedit 使用

1. 下载&#xff1a; 地址一搜就有&#xff0c;软件界面如下 BioEdit Download - Research software utility for creating and editing biological sequences 2. 酶切位点分析 构建过表达质粒、双荧光素酶质粒必用功能。以人的MYOD1基因为例 &#xff0c;分析酶切位点。 &…

BIO~~

BIO~~ 第一章 Java的I/O演进之路2.1 I/O 模型基本说明2.2 I/O模型Java BIOJava NIOJava AIO 2.3 BIO、NIO、AIO 适用场景分析 第三章 JAVA BIO深入剖析3.1 Java BIO 基本介绍3.2 Java BIO 工作机制3.3 传统的BIO编程实例回顾客户端案例如下服务端案例如下小结 3.4 BIO模式下多发…

python处理数据的一些代码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、如何读取txt文件&#xff0c;将其转化为DataFrame格式二、给DataFrame添加列名三、删除指定行四、读取csv文件&#xff0c;不让第一行成为列名五、读取DataFram…

BioGRID:蛋白质相互作用数据库

欢迎关注微信公众号《生信修炼手册》! BioGRID数据库是一个老牌经典的蛋白质相互作用数据库&#xff0c;在今年9月份刚刚分布了最新版本3.5.165&#xff0c;该版本从66,164篇文献中整理出了1,607,037个蛋白质相互作用&#xff0c;28,093个嵌合体信息以及726,378个转录后修饰PTM…

(NCRE网络技术)中小型网络系统总体规划与设计方法-知识点

欢迎您阅读此系列文章&#xff0c;文章参考自《全国计算机等级考试三级教程.网络技术》。内容为NCRE三级网络技术主要知识点以及常考点&#xff0c;此知识点总结参照《三级网络技术考试大纲(2018年版)》。阅读此系列文章可以帮助您快速、轻松考取相应证书&#xff01;祝您阅读愉…

Linux系统如何查看服务器带宽及网络使用情况

文章目录 前言  linux查看服务器带宽具体方法  一、使用speedtest-cli命令查看下载和上传最大流量值  二、查看网卡、网络的详情   1.查看服务器网络端口   2.ethtool命令查看宽带大小 三、nload命令实时统计网卡带宽使用率  四、dstat -n命令实时监测网络的状态…

计算机网络的组成及其逻辑结构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、计算机网络的组成 计算机系统&#xff1a; 数据通信系统 网络软件及网络协议 二、计算机网络的逻辑结构 资源子网 通信子网 总结 前言 计算机网络是在20世纪6…

Linux中centos修改系统时间并写到硬件,Linux中centos设置定时自动同步网络时间

文章目录 前言一、centos修改系统时间并写到硬件1.1查看当前的系统时间1.2修改系统时间1.3查看硬件时间1.4同步系统时间和硬件时间1.5本地时间写入硬件时间 二、centos设置定时自动同步网络时间2.1安装ntpdate工具2.2CentOS安装/操纵crontab2.3启动crontab并查看状态2.4写一个c…

计算机网络的发展简史

目录 前言一、互联网发展历史1. 第一阶段&#xff1a;ARPANET2. 第二阶段&#xff1a;三级结构互联网3. 第三阶段&#xff1a;多层次ISP互联网 二、中国互联网的发展简史1. 发展阶段2. 公共网络 总结 前言 时间是2022年的6月&#xff0c;当真正的注意到现在的时间时不禁感叹时…

浅谈网络舆情监测系统中爬虫的设计及系统架构

前言 说到网络舆情监测想必很多人都不陌生。可以跟大家这么说吧。爬虫所能带来的商业价值适用并深存于所有小-中-大企业中,尤其做网络舆情的大数据公司所有的业务基本都必须依托于爬虫来开展它的战略布局,毕竟有了米才能做饭嘛~ 不信的话我简单的来采访一下做舆情项目的相关…

基于java的网络在线考试管理系统的设计与实现--毕业开题报告

基于java的网络在线考试管理系 统的设计与实现开题报告–毕业设计 最近grace刚完成毕业设计 通过了赶紧来给宝贝们分享我的成果哈哈 设计题目&#xff1a;基于java的网络在线考试管理系统的设计与实现 一、选题依据&#xff1a; 1.国内外有关的研究动态 在线考试系统在国内…

校园网系统集成方案设计

校园网系统集成方案设计 第一篇的文章献给我的网络系统集成大作业&#xff0c;这篇文章是关于校园网系统集成方案的设计&#xff0c;文章有很多不足仅限于我目前的水平。 第一章 前言 随着经济的发展&#xff0c;信息起着越来越重要的作用。计算机、网络和多媒体等信息技术的…

VM虚拟机上的网络设置

1. 前言 一般Linux编程时,经常都会使用虚拟机跑Linux系统,VMware Workstation Pro 虚拟机里的系统不管是Linux、还是windows、还是其他系统想要上网就必须配置好虚拟网络连接方式。VMware Workstation 支持共享、桥接,选择网卡的方法自定义上网方式。 如果虚拟机里的系统想…