BIO 处理模型 | 学习笔记

简介: 快速学习 BIO 处理模型

开发者学堂课程【 Java 高级编程BIO 处理模型】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/20/detail/430


BIO处理模型


简介:现在尽管已经实现了一个标准的网络程序开发,但是在整个的开发过程之中本程序存在有严重的性能缺陷,因为该服务器只能够为一个线程提供 Echo 服务。

如果说现在的服务器需要有多人进行连接访问的时候那么其它的使用者将无法连接等待连接)。

所以现在就可以发现单线程的服务器开发本身就是一种不合理的做法,那么此时最好的解决方案将每一个连接到服务器上的客户端都通过一个线程对象来进行处理,即:服务器上启动多个线程,每一个线程单独为每一个客户端实现 Echo 服务支持。


Echo多线程模型(BIO)


图片3.png


范例:修改服务器端程序


​​package cn.mldn.demo.server;​​

​​import java.io.PrintWriter;​​

​​import java.net.ServerSocket;​​

​​import java.net.Socket; ​​

​​import java.util.Scanner;​​

​​public class EchoServer { ​​

​​private class ClientThread implements Runnable { ​​

​​private Socket client = null ;// 描述每-一个不同的客户端​​

​​private Scanner scan = nu11 ;​​

​​private PrintStream out = null ;​​

​​public ClientThread(Socket client) throws Exception { ​​

​​this.client = client ;​​

​​this.scan = new Scanner(client. getInputStream()) ; // 客户端输入流this. scan.useDelimiter("\n") ; //设置分隔符​​

​​ ​​

​​this.out = new PrintStream(client . getOutputStream()) ; //客户端输出流​​

​​@Override​​

​​public void run() { ​​

​​public static void main(String[] args) throws Exception { ​​

​​ServerSocket server = new ServerSocket(9999);//设置服务器端的监听端口System . out. println("等待客户端连接............");​​

​​Socket client = server .accept() ; // 有客户端连接​​

​​//首先需要先接收客户端发送来的信息,而后才可以将信息处理之后发送回客户端​​

​​boolean flag = true ; // 循环标记​​

​​/​​​​/首先需要先接收客户端发送来的信息,而后才可以将信息处理之后发送回客户端boolean flag = true ; //循环标记​​

​​boolean flag = true ; //循环标记​​

​​while (flag) { ​​

​​if(scan. hasNext()) { // 现在有数据发送​​

​​String val = scan.next(). trim() ; // 接收发送的数据if ("byebye". equalsIgnoreCase(val)) { ​​

​​out.print1n("ByeByeBye....");​​

​​flag = false ; //结束循环​​

​​} ​​

​​else { ​​

​​out.print1n(" [ECHO]" + val);​​

​​public static void main(String[] args) throws Exception f​​

​​ServerSocket server = new ServerSocket(9999) ; ​​​​//设置服务器端的监听端口​​​​ ​​

​​out.print1n("等待客​​​​​​​​​​​​​​​​接............");​​

​​//首先需要先接收客 户端发送来的信息,而后才可以将信息处理之后发送回客户端​​

​​boolean flag = true ; ​​​​//循环标记​​

​​while (flag) ​​​​{ ​​

​​Socket client = server .accept() ; ​​​​//有客户端连接​​

​​if( scan. hasNext()) ​​​​//现在有数据发送​​

​​String val = scan.next().trim() ; ​​​​//接收发送数据​​

​​if ("byebye" equalsIgnoreCase(val)) ​​​​{ ​​

​​out. println("ByeByeBye. . .");​​

​​flag = false ; // 结束循环​​

​​else f​​

​​out println(" ЕCHO + val);​​

​​scan.close();​​

​​out.close();​​

​​ ​​

​​client.close();​​

​​server .close( );​​



            </div>
相关文章
|
Java
BIO,NIO,AIO 有什么区别?
BIO,NIO,AIO 有什么区别? BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
68 0
【面试题精讲】javaIO模型之BIO
【面试题精讲】javaIO模型之BIO
|
2月前
|
网络协议 Dubbo Java
一文搞懂NIO、AIO、BIO的核心区别(建议收藏)
本文详细解析了NIO、AIO、BIO的核心区别,NIO的三个核心概念,以及NIO在Java框架中的应用等。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文搞懂NIO、AIO、BIO的核心区别(建议收藏)
|
2月前
|
存储 Java
BIO的工作流程
BIO(Blocking I/O)工作流程是指在进行输入输出操作时,线程会一直阻塞直到操作完成。具体流程包括:客户端发起请求,服务器接收后开始处理,期间服务器线程处于等待状态,直至数据准备完毕,响应返回给客户端,线程才继续执行其他任务。
44 5
|
2月前
|
Java
BIO、NIO、AIO 有什么区别
BIO(阻塞I/O)模型中,服务器实现模式为一个连接一个线程;NIO(非阻塞I/O)使用单线程或少量线程处理多个请求;AIO(异步I/O)则是在NIO基础上进一步优化,采用事件通知机制,提高并发处理能力。
65 5
|
3月前
|
Java Linux 应用服务中间件
【编程进阶知识】高并发场景下Bio与Nio的比较及原理示意图
本文介绍了在Linux系统上使用Tomcat部署Java应用程序时,BIO(阻塞I/O)和NIO(非阻塞I/O)在网络编程中的实现和性能差异。BIO采用传统的线程模型,每个连接请求都会创建一个新线程进行处理,导致在高并发场景下存在严重的性能瓶颈,如阻塞等待和线程创建开销大等问题。而NIO则通过事件驱动机制,利用事件注册、事件轮询器和事件通知,实现了更高效的连接管理和数据传输,避免了阻塞和多级数据复制,显著提升了系统的并发处理能力。
81 0
|
5月前
|
缓存 Java UED
BIO、NIO、AIO有什么区别
【8月更文挑战第16天】BIO、NIO、AIO有什么区别
99 4
|
6月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
197 1
|
7月前
|
Java
谈谈NIO和BIO区别
谈谈NIO和BIO区别
55 0
|
缓存 Java Linux
NIO vs BIO模型解读
NIO vs BIO模型解读