发现日常学习过的知识不久就会遗忘,在此只是整理并记录一下学习笔记,做个回忆,并方便以后查阅,若有错误,欢迎指正

网络模型: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代码实现(参考了一些市面上的视频资料,侵删)

服务端:

1 packagecom.study.server;2

3 importcom.study.info.HostInfo;4

5 importjava.io.IOException;6 importjava.io.PrintStream;7 importjava.net.ServerSocket;8 importjava.net.Socket;9 importjava.util.Scanner;10 importjava.util.concurrent.ExecutorService;11 importjava.util.concurrent.Executors;12

13 public classBIOEchoServer {14 public static void main(String[] args) throwsException{15 ServerSocket socket = newServerSocket(HostInfo.PORT);16 System.out.println("服务端已经启动,监听端口为:" +HostInfo.PORT);17 boolean flag = true;18 ExecutorService executorService = Executors.newFixedThreadPool(10);19 while(flag){20 Socket client =socket.accept();21 executorService.submit(newEchoClientHandler(client));22 }23 executorService.shutdown();24 socket.close();25 }26

27 private static class EchoClientHandler implementsRunnable{28

29 privateSocket client;30 privateScanner scanner;31 privatePrintStream out;32 private boolean flag = true;33

34 publicEchoClientHandler(Socket client){35 this.client =client;36 try{37 this.scanner = new Scanner(this.client.getInputStream());38 this.scanner.useDelimiter("\n");39 this.out = new PrintStream(this.client.getOutputStream());40 } catch(IOException e) {41 e.printStackTrace();42 }43 }44

45 public voidrun() {46 while (this.flag){47 if(this.scanner.hasNext()){48 String var = this.scanner.next().trim();49 System.out.println("收到客户端发来的"+var);50 if("byebye".equals(var)){51 this.out.print("888888");52 this.flag = false;53 } else{54 out.println("【echo】" +var);55 }56 }57 }58 try{59 this.scanner.close();60 this.out.close();61 this.client.close();62 } catch(IOException e) {63 e.printStackTrace();64 }65 }66 }67 }

客户端:

packagecom.study.client;importcom.study.info.HostInfo;importcom.study.util.InputUtil;importjava.io.PrintStream;importjava.net.Socket;importjava.util.Scanner;public classBIOEchoClient {public static void main(String[] args) throwsException{

Socket client= newSocket(HostInfo.HOST_NAME, HostInfo.PORT);

Scanner scan= newScanner(client.getInputStream());

scan.useDelimiter("\n");

PrintStream out= newPrintStream(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();

}

}

工具包:

1 packagecom.study.util;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6

7 public classInputUtil {8 private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(newInputStreamReader(System.in));9

10 privateInputUtil(){11 }12

13 public staticString getString(String prompt){14 boolean flag = true; //数据接受标记

15 String str = null;16 while(flag){17 System.out.println(prompt);18 try{19 str = KEYBOARD_INPUT.readLine(); //读取一行数据

20 if(str == null || "".equals(str)){21 System.out.println("数据输入错误,不允许为空!");22 }else{23 flag = false;24 }25 } catch(IOException e) {26 e.printStackTrace();27 }28 }29 returnstr;30 }31 }

IP及端口常量:

1 packagecom.study.info;2

3 public classHostInfo {4 public static final String HOST_NAME = "localhost";5 public static final int PORT = 9999;6 }

效果

代码思路整理:

服务端:

1.通过ServerSocket创建监听,并创建线程池

2.当ServerSocket通过accept方法接受到请求时,线程池将会分出一个线程来执行所要进行的操作

3.(分出的线程会)等待客户端输入完成(即客户端安排做的事),客户端输入完成,则将会执行自己的处理并返回相应的结果(需要服务端来进行的运算,取数等一些操作,本例中是更改字符串)

4.服务端处理完成,则将数据返回客户端,等待客户端的下次输入事件,循环3,4,直至客户端释放连接

客户端:

通过Socket创建客户端,在接受到键盘输入后,将输入信息写入OutputStream流中,并等待客户端返回信息,

接受到返回信息后,则接着往下执行,若不需输入,则释放连接

java bio_Java BIO及实现相关推荐

  1. bio linux 创建_不断升级,Java之BIO、NIO、AIO的演变

    一.前言 一句话概括BIO NIO AIO: 第一阶段,服务端采用同步阻塞的BIO: 第二阶段,服务端采用同步阻塞的线程池的BIO: 第三阶段,JDK4之后服务端采用同步非阻塞的NIO: 第四阶段,J ...

  2. Java IO BIO NIO

    Java IO BIO NIO 一.Java I/O概述 1.1 什么是流 1.2 流的分类 1.3 字符流 1.3.1 Reader 1.3.2 Writer 1.4 字节流 1.4.1 Input ...

  3. JAVA IO : BIO NIO AIO

    JAVA IO : BIO NIO AIO 同步异步.阻塞非阻塞概念 同步与异步 阻塞与非阻塞 IO VS NIO VS AIO 面向流与面向缓冲 阻塞与非阻塞IO BIO.NIO.AIO的JAVA实 ...

  4. java nio 李林峰_浅谈Java中BIO、NIO和AIO的区别和应用场景

    最近一直在准备面试,为了使自己的Java水平更上一个档次,拜读了李林峰老师的<Netty权威指南>,了解了Java关于IO的发展和最新的技术,真是受益匪浅,现在把我总结的关于BIO.NIO ...

  5. 常见的 IO 模型有哪些?Java 中 BIO、NIO、AIO 的区别?

    IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...

  6. JAVA 中BIO,NIO,AIO的理解

    [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? ...

  7. 谈谈java的bio、nio、aio模型

    目录 socket IO(BIO)和NIO的区别 同步和异步 bio:同步阻塞式IO NIO:同步非阻塞IO(工作中用的很少) Buffer使用 NIO代码 AIO socket Socket又称&q ...

  8. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

  9. 【Java】BIO、NIO、AIO网络编程模型概述

    前言 我们知道,UNIX环境下常见的网络I/O模型有5种: 同步阻塞 同步非阻塞 I/O复用 信号驱动 异步非阻塞 那么基于上述五种模型,Java中,随着NIO和AIO(NIO 2.0)的引入,一般具 ...

最新文章

  1. Linux source命令(转)
  2. 解决Extjs中textarea不支持keyup事件的问题
  3. mybatis多排序问题
  4. Falsy Bouncer-freecodecamp算法题目
  5. 小样本点云深度学习库_合成鲁棒的对抗样本来欺骗深度学习分类器
  6. B2C全开源无加密单商户商城源码可二开双端自适应
  7. NodeJS的环境变量process.env.*
  8. 新计算机主板不亮,电脑组装完毕之后点不亮怎么办 新电脑组装好开不了机的解决办法...
  9. 2021年CBA总决赛第二场预测
  10. PHP for 循环
  11. 【植被指数学习笔记】
  12. 计算机禁止安装游戏软件,win10禁止安装,手把手教你win10如何设置禁止安装软件...
  13. Javaweb项目各个模块的用途
  14. 用c语言编写定时器程序,C语言怎么实现定时器
  15. EVO自动处理SLAM数据脚本
  16. GPS定位准确度CEP、RMS
  17. 女儿怎样养才算是富养呢?
  18. 网络攻防技术——嗅探与欺骗
  19. Cookies vs. Sessions
  20. 网络爬虫 | selenium 爬取动态加载信息

热门文章

  1. RabbitMQ(七):RabbitMQ 消费端限流、TTL、死信队列是什么?
  2. linux内核生成img,linux内核探索:定制自己的initrd.img-转载并修改
  3. Linux qfile中文文件名,QFile无法打开包含unicode字符的文件名
  4. 必须为元素类型 association 声明属性 oftype。_CSS相关的选择器和属性介绍
  5. beast linux加密,PHP-Beast v2.2发布,PHP源码加密扩展
  6. 英文字母大写 html,英文大小写格式
  7. nginx 负载均衡配置_Nginx负载均衡NFS配置
  8. matlab s% d%,matlab中var函数的翻译For N-D arrays, VAR operates along the first
  9. unity能连jsp吗_Unity3D与JSP TomCat服务器传递数据和文件( 一) 建立Java服务器
  10. 遴选中计算机类,计算机卓越班遴选办法-计算机学院