Java BIO及实现
发现日常学习过的知识不久就会遗忘,在此只是整理并记录一下学习笔记,做个回忆,并方便以后查阅,若有错误,欢迎指正
网络模型:TCP/IP网络模型是从OSI七层模型中演化来的,osi模型分为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层,
TCP/IP网络模型分为:网络接口层,网际层,传输层,应用层
我对BIO的认识: 随着技术的发展,两个或以上的程序必然需要进行交互,于是BIO提供了一种端到端的通信,相当于对传输层的一种封装,对于开发人员而言
隐藏了传输的细节,将这些固定的“套路”抽象出来,提供一种端到端的通信,可以使我们更加专注于业务的开发,并且这种通讯是阻塞式的(block input output)
阻塞式:服务端启动,等待客户端的连接,在客户端连接到服务端后,服务端启动一个线程去监听客户端消息,客户端发送消息,并等待服务端返回(客户端一直阻塞),服务端收到消息,
将消息返回给客户端,此时一次交互完成。若还需交互,则不释放连接,客户端再次将消息发送给服务端,并等待返回,若不需要交互,则客户端释放连接。
生活中例子:A聘用了B干活,A让B去打印材料,在B去打印的期间,A一直在等待B的回来,在B没返回时,A将不做任何事情,一直等待B的返回,直到B返回后,A才接受到材料 (一次交互完成)
如果A还需要打印,则再次让B去打印,并等待B返回,期间什么都不干,如果不需要B去打印,就解除和B的聘用关系。直至再需要时聘用C
BIO代码实现(参考了一些市面上的视频资料,侵删)
服务端:
package com.study.server; import com.study.info.HostInfo; import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class BIOEchoServer {
public static void main(String[] args) throws Exception{
ServerSocket socket = new ServerSocket(HostInfo.PORT);
System.out.println("服务端已经启动,监听端口为:" + HostInfo.PORT);
boolean flag = true;
ExecutorService executorService = Executors.newFixedThreadPool(10);
while (flag){
Socket client = socket.accept();
executorService.submit(new EchoClientHandler(client));
}
executorService.shutdown();
socket.close();
} private static class EchoClientHandler implements Runnable{ private Socket client;
private Scanner scanner;
private PrintStream out;
private boolean flag = true; public EchoClientHandler(Socket client){
this.client = client;
try {
this.scanner = new Scanner(this.client.getInputStream());
this.scanner.useDelimiter("\n");
this.out = new PrintStream(this.client.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
} public void run() {
while (this.flag){
if(this.scanner.hasNext()){
String var = this.scanner.next().trim();
System.out.println("收到客户端发来的"+var);
if("byebye".equals(var)){
this.out.print("888888");
this.flag = false;
} else {
out.println("【echo】" + var);
}
}
}
try {
this.scanner.close();
this.out.close();
this.client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
package com.study.client; import com.study.info.HostInfo;
import com.study.util.InputUtil; import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner; public class BIOEchoClient {
public static void main(String[] args) throws Exception{
Socket client = new Socket(HostInfo.HOST_NAME, HostInfo.PORT);
Scanner scan = new Scanner(client.getInputStream());
scan.useDelimiter("\n");
PrintStream out = new PrintStream(client.getOutputStream());
boolean flag = true;
while (flag){
String inputData = InputUtil.getString("请输入要发送的内容:").trim();
out.println(inputData);
if (scan.hasNext()){
String str = scan.next();
System.out.println(str);
}
if ("byebye".equalsIgnoreCase(inputData)){
flag = false;
}
}
client.close();
}
}
工具包:
package com.study.util; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class InputUtil {
private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(new InputStreamReader(System.in)); private InputUtil(){
} public static String getString(String prompt){
boolean flag = true; //数据接受标记
String str = null;
while (flag){
System.out.println(prompt);
try {
str = KEYBOARD_INPUT.readLine(); // 读取一行数据
if(str == null || "".equals(str)){
System.out.println("数据输入错误,不允许为空!");
}else {
flag = false;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return str;
}
}
IP及端口常量:
package com.study.info;
public class HostInfo {
public static final String HOST_NAME = "localhost";
public static final int PORT = 9999;
}
效果

代码思路整理:
服务端:
1.通过ServerSocket创建监听,并创建线程池
2.当ServerSocket通过accept方法接受到请求时,线程池将会分出一个线程来执行所要进行的操作
3.(分出的线程会)等待客户端输入完成(即客户端安排做的事),客户端输入完成,则将会执行自己的处理并返回相应的结果(需要服务端来进行的运算,取数等一些操作,本例中是更改字符串)
4.服务端处理完成,则将数据返回客户端,等待客户端的下次输入事件,循环3,4,直至客户端释放连接
客户端:
通过Socket创建客户端,在接受到键盘输入后,将输入信息写入OutputStream流中,并等待客户端返回信息,
接受到返回信息后,则接着往下执行,若不需输入,则释放连接
Java BIO及实现的更多相关文章
- Java BIO、NIO、AIO 学习(转)
转自 http://stevex.blog.51cto.com/4300375/1284437 先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Ja ...
- JAVA bio nio aio
[转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? ...
- Java BIO、NIO、AIO-------转载
先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Ja ...
- Java BIO、NIO、AIO 学习
正在学习<大型网站系统与JAVA中间件实践>,发现对BIO.NIO.AIO的概念很模糊,写一篇博客记录下来.先来说个银行取款的例子: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO ...
- JAVA BIO与NIO、AIO的区别
IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...
- 3. 彤哥说netty系列之Java BIO NIO AIO进化史
你好,我是彤哥,本篇是netty系列的第三篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/ ...
- [转帖]JAVA BIO与NIO、AIO的区别(这个容易理解)
JAVA BIO与NIO.AIO的区别(这个容易理解) https://blog.csdn.net/ty497122758/article/details/78979302 2018-01-05 11 ...
- Java BIO、NIO、AIO 原理
先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Ja ...
- Java BIO、NIO、AIO 基础,应用场景
Java对BIO.NIO.AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必 ...
- Java BIO NIO 与 AIO
回顾 上一章我们介绍了操作系统层面的 IO 模型. 阻塞 IO 模型. 非阻塞 IO 模型. IO 复用模型. 信号驱动 IO 模型(用的不多,知道个概念就行). 异步 IO 模型. 并且介绍了 IO ...
随机推荐
- Mybatis系列(三)XML
Mybatis系列(三)XML 1.pom.xml依赖: <?xml version="1.0" encoding="UTF-8"?> <pr ...
- DNS解析域名的过程
一.DNS解析域名的过程 1.大的过程可分为三步: (1).在缓存中查找是否之前解析过 (2).在windows系统的host文件中查找 (3).请求DNS服务器 2.小的过程可分为十步: (1).浏 ...
- docker java环境 直接做成镜像 跑自己的java包
yum install docker #基于阿里源 可以直接下载 systemctl restart docker ifconfig #出现 docker0 说明环境部署成功 docker ver ...
- 修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)
上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationB ...
- iOS -打包上传成功,在"构建版本"一直刷不出来
今天提交版本到appstore,构建版本一直不出来,等了一天也没有出来,其实就是权限问题,iOS13 来了,所以面临的问题随之而来,苹果给邮箱发了这段话: Dear Developer,We iden ...
- Vue路由(vue-router)详细讲解指南
中文文档:https://router.vuejs.org/zh/ Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.路由实际 ...
- TestNG(四) 基本注解BeforeSuite和AfterSuite
package com.course.testng; import org.testng.annotations.*; public class BasicAnnotation { @Test //最 ...
- centos7下mysql 用户管理和权限设置
1.进入mysql命令行,输入root及密码[root@localhost ~]# mysql -u root -pEnter password: Welcome to the MySQL monit ...
- Android嵌入式开发初学者的几个注意点
一:首先你必须了解ARM平台 Android 移植与驱动核心开发,当然也可以是X86和其他的平台,不过其他平台的Android智能终端开发并不是很多. Android嵌入式智能操作系统是基于Linux ...
- 【linux】【elasticsearch】解决docker pull error pulling image configuration: Get https://d2iks1dkcwqcbx.cloudfront.net/
网络原因导致的问题: error pulling image configuration: Get https://d2iks1dkcwqcbx.cloudfront.net/docker/regis ...