一、Netty是个啥?
刚开始学,体会不是很深刻,说说我的简单理解。
- 一个异步、基于事件驱动的网络应用框架。异步好理解,基于事件驱动,这边我理解就是类似客户端、服务端这种请求响应的动作。
- 针对TCP协议
- 本质是一个NIO框架,这边引出NIO,后边会说
二、Netty的应用场景
举个例子:Dubbo框架节点间通信的底层原理就是用的Netty。
其实,涉及网络通信的应用的实现,应该都可以基于Netty。
三、从NIO引出的IO模型
java有3种网络类型的io模型:AIO、BIO、NIO
- AIO
(1)异步非阻塞,适用连接数多且长时间连接的场景
(2)异步通道,一个有效的请求才会启动线程
- BIO
(1)同步阻塞,一个请求对应一个线程
简单写了一个BIO的服务端的实现:
package com.angliali.bio;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BIOClientService {
public static void main(String[] args) throws IOException {
//1、创建线程池
//2、如果有客户端连接,就创建一个线程,与之通信
ExecutorService pool = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动");
while(true){
final Socket socket = serverSocket.accept();
System.out.println("连接一个客户端");
pool.execute(new Runnable() {
public void run() {
//与客户端通信
handler(socket);
}
});
}
}
private static void handler(Socket socket){
try {
byte[] bytes = new byte[1024];
InputStream inputStream = socket.getInputStream();
while (true){
int read = inputStream.read(bytes);
if(read!= -1){
System.out.println(new String(bytes,0,read));
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
socket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
- NIO
(1)同步非阻塞,由多个请求,通过多路复用,对应到一个线程中