Netty学习--第一章 JDK自带的BIO
一、什么是BIO
BIO是传统的通信技术,在BIO通信模型中,客户端发送请求给服务器,服务器每次都是会单独创建一个线程来监控客户端的请求,会为每个客户端创建一个线程来处理请求。当前服务器处理完成后,通过原来的输出流返回处理结果给到客户端。如图:

二、JDK实现BIO的案例
按照上面的图,我们知道至少需要三给类来完成,一个客户端,一个服务端,一个服务端逻辑处理:
服务器代码:
/**
* 服务端代码
*/
public class BioServer { //端口号
private final static int port = 8080; public static void main(String[] args) {
//创建一个ServerSocket对象,作为服务器
ServerSocket server = null;
try {
server = new ServerSocket(port);
System.out.println("服务器启动,端口号为:" + port);
Socket socket = null;
while (true) {
//阻塞服务器,等待客户端发送数据
socket = server.accept();
//客户端发送了数据,开始处理
new Thread(new BioServerShow(socket)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (server != null) {
System.out.println("The time server close");
try {
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
server = null;
}
} } }
服务器逻辑处理类:
/**
* 服务器处理数据逻辑类
*/
public class BioServerShow implements Runnable{
private Socket socket; public BioServerShow(Socket socket) {
this.socket = socket;
} @Override
public void run() {
//输入流的内容表示客户端带来的消息
BufferedReader in = null;
//输出流的内容表示服务器要发送给客户端的内容
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
out = new PrintWriter(this.socket.getOutputStream(), true);
String body = null;
while (true) {
body = in.readLine();
if (body == null)
break;
System.out.println("客户端发生的请求是: " + body);
out.println("你好");
} } catch (Exception e) {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (out != null) {
out.close();
out = null;
}
if (this.socket != null) {
try {
this.socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
this.socket = null;
}
}
}
}
客户端代码:
/**
* 客户端代码
*/
public class BioClient {
public static void main(String[] args) {
int port = 8080;
//创建一个socke对象,连接服务器,IP和端口必须一致
Socket socket = null;
//输入流的内容表示服务端带来的消息
BufferedReader in = null;
//输出流的内容表示客户端要发送给服务端的请求
PrintWriter out = null;
try {
socket = new Socket("127.0.0.1", port);
System.out.println("客户端启动");
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
out.println("你好,我是客户端");
String resp = in.readLine();
System.out.println("服务器的消息是: " + resp);
} catch (Exception e) {
} finally {
if (out != null) {
out.close();
out = null;
} if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
socket = null;
}
}
} }
测试:
我们先运行服务端代码:

然后运行客户端代码:

接下来我们在看服务端的控制台,发现有客户端的数据打印出来:

三、BIO通信的优点与缺点
先说优点:
1.模型简单,这个从上面的那张图就可以明白,BIO的模型是很简单的:客户端发送请求,服务器阻塞分发请求到处理的线程,最后将结果返回给客户端。
2.编码简单,这个也能从我们的代码中看见,编码逻辑都很简易的。
再说说缺点:
由于BIO的模型,我们就能发现这个模型最大的缺点就是性能太低,特别是在请求数过多的高并发下,服务器CPU的上下文切换太耗费资源,就是线程的创建与销毁。
Netty学习--第一章 JDK自带的BIO的更多相关文章
- Java 学习第一步-JDK安装和Java环境变量配置
Java学习第一步——JDK安装及Java环境变量配置 [原文] 2014-05-30 9:09 Java SE 阿超 9046 views Java作为当下很主流的编程语言,学习Java的朋 ...
- web学习第一章
web学习第一章 我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...
- oracle学习 第一章 简单的查询语句 ——03
1.1最简单的查询语句 例 1-1 SQL> select * from emp; 例 1-1 结果 这里的 * 号表示全部的列.它与在select 之后列出全部的列名是一样的.查询语句以分号( ...
- Java基础知识二次学习-- 第一章 java基础
基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第一章
Asp.Net MVC4 + Oracle + EasyUI 第一章 --操作数据和验证 本文链接:http://www.cnblogs.com/likeli/p/4234238.html 文章集合 ...
- Ruby学习-第一章
第一章 字符串,数字,类和对象 为了证明Ruby真的好用,hello world也能写的如此简洁: puts 'hello world' 1.输入/输出 print('Enter your name' ...
- Netty学习第一节Netty的总体概况
一.Netty简介 什么是Netty? 1.高性能事件驱动,异步非阻塞的IO加载开源框架. 它是由JBoss提供,用于建立TCP等底层链接.基于Netty可以建立高性能的HTTP服务器,快速开发高性能 ...
- Intel汇编语言程序设计学习-第一章 基本概念
第一章基本概念 1.1 简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...
- swift系统学习第一章
第一节:变量,常量,类型推断,字符,字符串 //swift学习第一节 /* 变量 常量 类型推断 字符 字符串 */ import UIKit //变量 var str = "swift&q ...
随机推荐
- 我写过的bug...
添加对,更新和查询出错 因为只写了bean里只写了se't方法,没有写get 多条件联合查询,后一个条件没用 写xml里面复制上一行,忘记把变量名改了(propertyValue没改成register ...
- Git-Runoob:Git 创建仓库
ylbtech-Git-Runoob:Git 创建仓库 1.返回顶部 1. Git 创建仓库 本章节我们将为大家介绍如何创建一个 Git 仓库. 你可以使用一个已经存在的目录作为Git仓库. git ...
- java kryo序列化与反序列化
https://blog.csdn.net/lan12334321234/article/details/84907492 问题: https://blog.csdn.net/baidu_384041 ...
- tuple用法
1 tuple中的元素可以直接赋给相同个数的变量 tup1 = ('asfa',234) p, q = tup1 print(p) print(q) # asfa # 参考:https://www.r ...
- CentOS6.5 编译安装Nginx
一.准备编译环境 1. 系统为centos6.5最小安装,关闭selinux,关闭防火墙. 2. 安装编译工具 # yum -y install gcc gcc-c++ autoconf automa ...
- 应用安全 - 软件漏洞 - 可视化平台kibana漏洞汇总
CVE-2019-7609 Date: 类型: RCE 前置条件: Timelion And Canvas 影响范围: kibana-RCE < PoC | ExP: https://gith ...
- python+selenium下载文件——firefox
修改Firefox的相关配置. 1.profile.set_preference('browser.download.folderList',2) 设置成0代表桌面,1代表下载到浏览器默认下载路径:2 ...
- c++ k^1
如果k是偶数,则使k=k+1:若k是奇数,则使k=k-1.
- centos7里创建用户和组
1.创建组distro,其GID为2019groupadd -g 2019 distro 2.创建用户mandriva, 其ID号为1005:基本组为distro useradd mandriva - ...
- 普通项目——>maven项目——>SSM(一)
首先应该明白,SSM是什么? SSM指的是Spring+SpringMVC+MyBatis Spring Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体 ...