课程名称: 解锁网络编程之NIO的前世今生
课程章节:第2章 NIO网络编程模型、第3章 【熟悉】NIO网络编程详解
课程讲师: 张小喜
课程内容:
NIO : Non-blocking I/O 或New I/O
JDK 1.4
高并发网络服务器支持岗
服务端等待客户端请求中是阻塞的,一直在等待,很多客户端请求时会遇到服务器建立线程资源枯竭的问题。
改进点就是将阻塞IO修改为非阻塞IO模型,解耦,单线程节省资源
channel 同流不同的地方在于channel是双向的,可读可写。
非阻塞性
操作唯一性,只能通过buffer来操作
实现类
文件类:FileChannel
UDP类:DatagramChannel
TCP类:ServerSockerChannel / SocketChannel
try { // 服务器通过服务端Socket 创建channel ServerSocketChannel serverChannel = ServerSocketChannel.open(); // 服务端绑定端口 serverChannel.bind(new InetSocketAddress(8000)); // 服务器端监听客户端连接,建立socketchannel连接 SocketChannel accept = serverChannel.accept(); // 客户端连接远程主机及端口 SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8000)); } catch (IOException e) { e.printStackTrace(); }
Buffer简介
作用:读写channel中数据
本质:一块内存区域,本质相当于byte的数组
属性: Capacity 容量 超过容量清空后再写入
Position 位置 当前位置,读模式时position重置为0
limit 上限 写模式时最多可以写入的,读模式表示可以最多读取的数据-写模式下的position值
Mark 标记 存储一个特定的position,调用buffer的reset方法恢复到mark位置,依然可以从这个位置开始处理数组
除了boolean之外基础的数据类型都有buffer的实现类
ByteBuffer bytebuf = ByteBuffer.allocate(10); bytebuf.put("agc".getBytes(Charset.forName("UTF-8"))); // 从写模式切换到读模式 bytebuf.flip(); byte b = bytebuf.get(); System.out.println(b); Buffer mark = bytebuf.mark(); bytebuf.get(); bytebuf.reset(); bytebuf.clear();
课程收获:
NIO核心类的相关方法介绍和使用,对后面的实战打下基础