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

网络模型: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及实现的更多相关文章

  1. Java BIO、NIO、AIO 学习(转)

    转自 http://stevex.blog.51cto.com/4300375/1284437 先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Ja ...

  2. JAVA bio nio aio

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

  3. Java BIO、NIO、AIO-------转载

    先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Ja ...

  4. Java BIO、NIO、AIO 学习

    正在学习<大型网站系统与JAVA中间件实践>,发现对BIO.NIO.AIO的概念很模糊,写一篇博客记录下来.先来说个银行取款的例子: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO ...

  5. JAVA BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  6. 3. 彤哥说netty系列之Java BIO NIO AIO进化史

    你好,我是彤哥,本篇是netty系列的第三篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/ ...

  7. [转帖]JAVA BIO与NIO、AIO的区别(这个容易理解)

    JAVA BIO与NIO.AIO的区别(这个容易理解) https://blog.csdn.net/ty497122758/article/details/78979302 2018-01-05 11 ...

  8. Java BIO、NIO、AIO 原理

    先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Ja ...

  9. Java BIO、NIO、AIO 基础,应用场景

    Java对BIO.NIO.AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必 ...

  10. Java BIO NIO 与 AIO

    回顾 上一章我们介绍了操作系统层面的 IO 模型. 阻塞 IO 模型. 非阻塞 IO 模型. IO 复用模型. 信号驱动 IO 模型(用的不多,知道个概念就行). 异步 IO 模型. 并且介绍了 IO ...

随机推荐

  1. AOE工程实践-银行卡OCR里的图像处理

    作者:杨科 近期我们开发了一个银行卡 OCR 项目.需求是用手机对着银行卡拍摄以后,通过推理,可以识别出卡片上的卡号. 工程开发过程中,我们发现手机拍摄以后的图像,并不能满足模型的输入要求.以 And ...

  2. 【Offer】[14] 【剪绳子】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1).每段的绳子的长度记为k[0].k[1].--.k[m] ...

  3. 数论 Day 12

    数论是个好东西 今天讲的是组合计数 组合计数 组合数学主要是研究一组离散对象满足一定条件的安排的存在性.构造及计数问题.计数理论是狭义组合数学中最基本的一个研究方向,主要研究的是满足一定条件的排列组合 ...

  4. 明明有class为什么还是报ClassNotFoundException?

    描述 我们修改接口时,习惯发布一个快照版本用于测试.我们的一个服务也是发布了快照版本,然后一个jar程序要依赖这个服务,修改pom文件打包部署后,通过 java -jar 命令执行这个jar程序,然后 ...

  5. Net基础篇_学习笔记_第十一天_面向对象(面向过程与面向对象的区别/类的概念)

    1.面向过程-----> 面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱里1.打开冰箱门2.把大象塞进去,亲下大象的屁股3.关闭冰箱门 孙全 瘦小 ...

  6. Azure虚拟机时间同步问题

    场景描述:在Azure上新创建虚拟机默认是UTC时区的,因为业务在国内,所以要修改在CST注:协调世界时(英语:Coordinated Universal Time,法语:Temps Universe ...

  7. Netty源码分析 (十一)----- 拆包器之LengthFieldBasedFrameDecoder

    本篇文章主要是介绍使用LengthFieldBasedFrameDecoder解码器自定义协议.通常,协议的格式如下: LengthFieldBasedFrameDecoder是netty解决拆包粘包 ...

  8. 目标检测中常提到的IoU和mAP究竟是什么?

    看完这篇就懂了. IoU intersect over union,中文:交并比.指目标预测框和真实框的交集和并集的比例. mAP mean average precision.是指每个类别的平均查准 ...

  9. SpringBoot之简单入门

    一,spring boot 是什么? spring boot的官网是这样说的: Spring Boot makes it easy to create stand-alone, production- ...

  10. MySQL中对字段内容为Null的处理

    使用如下指令,意思就是 select IFNULL(jxjy,0) AS jxjy from yourTable ifnull(a,b) 意思是指:如果字段a为null,就等于b if( sex = ...