Netty特点
Netty是一款基于java NIO开发的网络通信框架, 帮助用户快速简便开发高性能协议服务端和客户端
- 高并发: 基于NIO
- 传输快: 零拷贝减少不必要的内存拷贝
- 封装好: 易于使用的接口
复习:
BIO
Blocking, 每个用户连接请求建立一个线程处理, 连接后服务端调用read()读取用户数据, 如果用户无数据或数据未准备好(需要从内核态通过系统调用, 在内核态复制, 再回到用户态), 则线程一直阻塞等待
伪异步BIO
将用户连接请求放入队列, 用一个线程提供连接服务, 但依然一个线程只能服务一个连接, 无数据/数据未准备好时阻塞等待
NIO
同步非阻塞
用户连接请求后, 建立服务端线程, 但线程立即返回, 执行其他内容, 无需等待. 由一个线程轮询数据是否准备好,
java NewIO
服务端一个线程(server selector)负责轮询是否有新的连接请求, 如果有就将其注册到client selector上, client selector轮询发现数据准备好后才启动一个线程处理
AIO
异步指程序不需要轮询或等待数据, 而是立即返回, 由操作系统通知I/O完成
java BIO 编程
public static void main (String args[]) throws IOException {
ServerSocket ss = new ServerSocket(8080);
while(true){
Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((line = br.readLine()) != null) {
System.out.println(br.read());
}
}
}
Netty 编程
public class EchoServer {
private final int port;
public EchoServer(int port) {
this.port = port;
}
public static void main(String[] args) throws InterruptedException {
new EchoServer(8888).start();
}
public void start() throws InterruptedException {
final EchoServerHandler serverHandler = new EchoServerHandler();//处理数据的类
//创建EventLoopGroup,处理事件的循环线程池
EventLoopGroup boss = new NioEventLoopGroup();// 处理连接请求
EventLoopGroup worker = new NioEventLoopGroup();// 处理数据读写
try {
ServerBootstrap b = new ServerBootstrap();// 服务引导类
b.group(boss,worker)
//指定所使用的NIO传输 Channel
.channel(NioServerSocketChannel.class)
//使用指定的端口设置套接字地址
.localAddress(new InetSocketAddress(port))
//添加一个EchoServerHandler到子Channel的ChannelPipeline
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//EchoServerHandler标志为@Shareable,所以我们可以总是使用同样的实例
socketChannel.pipeline().addLast(serverHandler);// handler实际处理数据
}
});
//异步的绑定服务器,调用sync()方法阻塞等待直到绑定完成
ChannelFuture future = b.bind().sync();
future.channel().closeFuture().sync();
} finally {
//关闭EventLoopGroup,释放所有的资源
group.shutdownGracefully().sync();
worker.shutdownGracefully().sync();
}
}
}
/*
作者:pjmike_pj
链接:https://juejin.cn/post/6844903682425749517
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/