什么是Nginx、BIO、NIO、AIO

发布时间:2021-10-12 10:59:13 作者:iii
来源:亿速云 阅读:284

这篇文章主要介绍“什么是Nginx、BIO、NIO、AIO”,在日常操作中,相信很多人在什么是Nginx、BIO、NIO、AIO问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Nginx、BIO、NIO、AIO”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1. 什么是IO

什么是Nginx、BIO、NIO、AIO

2. 在了解不同的IO之前先了解:同步与异步,阻塞与非阻塞的区别

3. 什么是BIO

BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,没处理完之前此线程不能做其他操作(如果是单线程的情况下,我传输的文件很大呢?),当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

4. 什么是NIO

NIO:同步非阻塞,服务器实现一个连接一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4之后开始支持。

5. 什么是AIO

6. 什么Netty

什么是Nginx、BIO、NIO、AIO

7. BIO和NIO、AIO的区别

8. IO流的分类

什么是Nginx、BIO、NIO、AIO

9. 什么是内核空间

什么是Nginx、BIO、NIO、AIO

10. 五种IO模型

注意:我这里的用户空间就是应用程序空间

10.1 阻塞BIO(blocking I/O)

什么是Nginx、BIO、NIO、AIO

10.2.非阻塞NIO(noblocking I/O)

B也在河边钓鱼,但是B不想将自己的所有时间都花费在钓鱼上,在等鱼上钩这个时间段中,B也在做其他的事情(一会看看书,一会读读报纸,一会又去看其他人的钓鱼等),但B在做这些事情的时候,每隔一个固定的时间检查鱼是否上钩。一旦检查到有鱼上钩,就停下手中的事情,把鱼钓上来。 B在检查鱼竿是否有鱼,是一个轮询的过程。

什么是Nginx、BIO、NIO、AIO

10.3.异步AIO(asynchronous I/O)

什么是Nginx、BIO、NIO、AIO

10.4.信号驱动IO(signal blocking I/O)

G也在河边钓鱼,但与A、B、C不同的是,G比较聪明,他给鱼竿上挂一个铃铛,当有鱼上钩的时候,这个铃铛就会被碰响,G就会将鱼钓上来。

什么是Nginx、BIO、NIO、AIO

10.5.IO多路转接(I/O multiplexing)

什么是Nginx、BIO、NIO、AIO

11. 什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别

12. 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作

13. 在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用

14. 怎么生成SerialversionUID

什么是Nginx、BIO、NIO、AIO

15. BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法

属于处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法

16. Java中流类的超类主要有那些?

17. 为什么图片、视频、音乐、文件等 都是要字节流来读取

什么是Nginx、BIO、NIO、AIO

18. IO的常用类和方法,以及如何使用

什么是Nginx、BIO、NIO、AIO

19. IO基本操作讲解

这里的基本操作就是普通的读取操作,如果想要跟深入的了解不同的IO开发场景必须先了解IO的基本操作

20. 网络操作IO讲解

21. 网络操作IO编程演变历史

21.1 BIO编程会出现什么问题?

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

package com.test.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//TCP协议Socket使用BIO进行通信:服务端
public class BIOServer {
// 在main线程中执行下面这些代码
public static void main(String[] args) {
//使用Socket进行网络通信
ServerSocket server = null;
Socket socket = null;
//基于字节流
InputStream in = null;
OutputStream out = null;
try {
server = new ServerSocket(8000);
System.out.println("服务端启动成功,监听端口为8000,等待客户端连接...");
while (true){
socket = server.accept(); //等待客户端连接
System.out.println("客户连接成功,客户信息为:" +
socket.getRemoteSocketAddress());
in = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//读取客户端的数据
while ((len = in.read(buffer)) > 0) {
System.out.println(new String(buffer, 0, len));
}
//向客户端写数据
out = socket.getOutputStream();
out.write("hello!".getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP协议Socket使用BIO进行通信:客户端(第二执行)
package com.test.io;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
//TCP协议Socket使用BIO进行通信:客户端
public class Client01 {
public static void main(String[] args) throws IOException {
//创建套接字对象socket并封装ip与port
Socket socket = new Socket("127.0.0.1", 8000);
//根据创建的socket对象获得一个输出流
//基于字节流
OutputStream outputStream = socket.getOutputStream();
//控制台输入以IO的形式发送到服务器
System.out.println("TCP连接成功 \n请输入:");
String str = new Scanner(System.in).nextLine();
byte[] car = str.getBytes();
outputStream.write(car);
System.out.println("TCP协议的Socket发送成功");
//刷新缓冲区
outputStream.flush();
//关闭连接
socket.close();
}
}
package com.test.io;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
//TCP协议Socket:客户端
public class Client02 {
public static void main(String[] args) throws IOException {
//创建套接字对象socket并封装ip与port
Socket socket = new Socket("127.0.0.1", 8000);
//根据创建的socket对象获得一个输出流
//基于字节流
OutputStream outputStream = socket.getOutputStream();
//控制台输入以IO的形式发送到服务器
System.out.println("TCP连接成功 \n请输入:");
String str = new Scanner(System.in).nextLine();
byte[] car = str.getBytes();
outputStream.write(car);
System.out.println("TCP协议的Socket发送成功");
//刷新缓冲区
outputStream.flush();
//关闭连接
socket.close();
}
}

21.2 多线程解决BIO编程会出现的问题

这时有人就会说,我多线程不就解决了吗?

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

package com.test.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//TCP协议Socket使用多线程BIO进行通行:服务端
public class BIOThreadService {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8000);
System.out.println("服务端启动成功,监听端口为8000,等待客户端连接... ");
while (true) {
Socket socket = server.accept();//等待客户连接
System.out.println("客户连接成功,客户信息为:" +
socket.getRemoteSocketAddress());
//针对每个连接创建一个线程, 去处理I0操作
//创建多线程创建开始
Thread thread = new Thread(new Runnable() {
public void run() {
try {
InputStream in = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//读取客户端的数据
while ((len = in.read(buffer)) > 0) {
System.out.println(new String(buffer, 0, len));
}
//向客户端写数据
OutputStream out = socket.getOutputStream();
out.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

21.3 线程池解决多线程BIO编程会出现的问题

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

package com.test.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//TCP协议Socket使用线程池BIO进行通行:服务端
public class BIOThreadPoolService {
	public static void main(String[] args) {
		//创建线程池
		ExecutorService executorService = Executors.newFixedThreadPool(30);
		try {
			ServerSocket server = new ServerSocket(8000);
			System.out.println("服务端启动成功,监听端口为8000,等待客户端连接...");
			while (true) {
				Socket socket = server.accept();
				//等待客户连接
				System.out.println("客户连接成功,客户信息为:" +
				socket.getRemoteSocketAddress());
				//使用线程池中的线程去执行每个对应的任务
				executorService.execute(new Thread(new Runnable() {
					public void run() {
						try {
							InputStream in = socket.getInputStream();
							byte[] buffer = new byte[1024];
							int len = 0;
							//读取客户端的数据
							while ((len = in.read(buffer)) > 0) {
								System.out.println(new String(buffer, 0, len));
							}
							//向客户端写数据
							OutputStream out = socket.getOutputStream();
							out.write("hello".getBytes());
						}
						catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
				)
				);
			}
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}

21.4 使用NIO实现网络通信

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

package com.test.io;
import com.lijie.iob.RequestHandler;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NIOServer {
	public static void main(String[] args) throws IOException {
		//111111111
		//Service端的Channel,监听端口的
		ServerSocketChannel serverChannel = ServerSocketChannel.open();
		//设置为非阻塞
		serverChannel.configureBlocking(false);
		//nio的api规定这样赋值端口
		serverChannel.bind(new InetSocketAddress(8000));
		//显示Channel是否已经启动成功,包括绑定在哪个地址上
		System.out.println("服务端启动成功,监听端口为8000,等待客户端连接..."+
		serverChannel.getLocalAddress());
		//22222222
		//声明selector选择器
		Selector selector = Selector.open();
		//这句话的含义,是把selector注册到Channel上面,
		//每个客户端来了之后,就把客户端注册到Selector选择器上,默认状态是Accepted
		serverChannel.register(selector, SelectionKey.OP_ACCEPT);
		//33333333
		//创建buffer缓冲区,声明大小是1024,底层使用数组来实现的
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		RequestHandler requestHandler = new RequestHandler();
		//444444444
		//轮询,服务端不断轮询,等待客户端的连接
		//如果有客户端轮询上来就取出对应的Channel,没有就一直轮询
		while (true) {
			int select = selector.select();
			if (select == 0) {
				continue;
			}
			//有可能有很多,使用Set保存Channel
			Set<SelectionKey> selectionKeys = selector.selectedKeys();
			Iterator<SelectionKey> iterator = selectionKeys.iterator();
			while (iterator.hasNext()) {
				//使用SelectionKey来获取连接了客户端和服务端的Channel
				SelectionKey key = iterator.next();
				//判断SelectionKey中的Channel状态如何,如果是OP_ACCEPT就进入
				if (key.isAcceptable()) {
					//从判断SelectionKey中取出Channel
					ServerSocketChannel channel = (ServerSocketChannel)
					key.channel();
					//拿到对应客户端的Channel
					SocketChannel clientChannel = channel.accept();
					//把客户端的Channel打印出来
					System.out.println("客户端通道信息打印:" + clientChannel.getRemoteAddress());
					//设置客户端的Channel设置为非阻塞
					clientChannel.configureBlocking(false);
					//操作完了改变SelectionKey中的Channel的状态OP_READ
					clientChannel.register(selector, SelectionKey.OP_READ);
				}
				//到此轮训到的时候,发现状态是read,开始进行数据交互
				if (key.isReadable()) {
					//以buffer作为数据桥梁
					SocketChannel channel = (SocketChannel) key.channel();
					//数据要想读要先写,必须先读取到buffer里面进行操作
					channel.read(buffer);
					//进行读取
					String request = new String(buffer.array()).trim();
					buffer.clear();
					//进行打印buffer中的数据
					System.out.println(String.format("客户端发来的消息: %s : %s",
					channel.getRemoteAddress(), request));
					//要返回数据的话也要先返回buffer里面进行返回
					String response = requestHandler.handle(request);
					//然后返回出去
					channel.write(ByteBuffer.wrap(response.getBytes()));
				}
				iterator.remove();
			}
		}
	}
}

什么是Nginx、BIO、NIO、AIO

package com.test.io;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
//TCP协议Socket:客户端
public class Client01 {
	public static void main(String[] args) throws IOException {
		//创建套接字对象socket并封装ip与port
		Socket socket = new Socket("127.0.0.1", 8000);
		//根据创建的socket对象获得一个输出流
		OutputStream outputStream = socket.getOutputStream();
		//控制台输入以IO的形式发送到服务器
		System.out.println("TCP连接成功 n请输入:");
		while(true){
			byte[] car = new Scanner(System.in).nextLine().getBytes();
			outputStream.write(car);
			System.out.println("TCP协议的Socket发送成功");
			//刷新缓冲区
			outputStream.flush();
		}
	}
}

21.5 使用Netty实现网络通信

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

什么是Nginx、BIO、NIO、AIO

到此,关于“什么是Nginx、BIO、NIO、AIO”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. netty系列之Java BIO NIO AIO进化史
  2. Java中BIO、NIO、AIO的理解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:什么是Docker容器数据卷

下一篇:Wormhole大数据流式处理平台的设计思想是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》