网络编程-NIO

一、NIO网络模型

Non-Blocking I/O 或 New I/O,开始与JDK1.4
服务于高并发网络服务器

NIO网络模型

二、NIO核心类

NIO核心

  • Channel:通道
  • Buffer:缓冲区
  • Selector:选择器 或者 多路复用器
1.NIO核心类-Channel

特性

  • 双向性
  • 非阻塞
  • 操作唯一性:基于字节块操作,只能通过Buffer

实现

  • 文件类:FileChannel
  • UDP类:DatagramChannel
  • TCP类:ServerSocketChannel / SocketChannel

Socket回顾
服务端代码

/**
*1. 监听端口
*/
ServerSocket ServerSocket = new ServerSocket(port:8000;
while(true) {
    // 2. 接受请求,建立连接
    Socket socket = serverSocket.accept();
    // 3. 数据交换
    new Thread(new BIOServerHandler(socket)).start();
}
/**
*4. 关闭资源
*/
serverSocket.close();

客户端代码

/**
*1. 建立连接
*/
Socket socket = new Socket("127.0.0.1", port:8000);
/**
* 获取输入输出流
*/
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStram();

Channel使用

/**
*代码片段1: 服务器端通过服务端socket创建channel
*/
ServerSocketChannel ServerSocketChannel = ServerSocketChannel.open();

/**
* 代码片段2:服务器端绑定端口
*/
ServerSocketChannel.bind(new InetSocketAddress(8000);

/**
* 代码片段3:服务器端监听客户端连接,建立socketChannel连接
*/
SocketChannel socketChannel = serverSocketChannel.accept();

/**
* 代码片段4:客户端连接远程主机及端口
*/
SocketChannel socketChannel = SocketChannel.open(
                            new InetSocketAdress("127.0.0.1", 8000));
2.NIO核心类-Buffer

作用:读取Channel中的数据
本质:一块内存区域
Buffer属性

  1. Capacity:容量
  2. Position:位置
  3. Limit:上限
  4. Mark:标记

Buffer的使用

/**
*初始化长度为10的byte类型buffer
*/
ByteBuffer.allocate(10);

在这里插入图片描述

/**
* 向byteBuffer中写入三个字节
*/
byteBuffer.put("abc".getBytes(Charset.forName("UTF-8")));

在这里插入图片描述

/**
*将byteBuffer从写模式切换为读模式
*/
byteBuffer.flip();

在这里插入图片描述

/**
* 从byteBuffer中读取一个字节
*/
byteBuffer.get();

在这里插入图片描述

/**
* 调用mark方法记录当前position的位置
*/
byteBuffer.mark();

在这里插入图片描述

/**
*调用clear方法,将所有的属性重置
*/
byteBuffer.clear();

在这里插入图片描述

3.NIO核心类-Selector

作用:I/O就绪选择,能够检测1到N个通道,并能知道通道是否为读写做好准备的组件,通过它,一个单独的线程就能管理多个Channel,从而管理多个网络连接
地位:NIO网络编程的基础
Selector使用

/**
* 代码片段1:创建Selector
*/
Selector selector = Selector.open();

/**
* 代码片段2:将channel注册到selector上,监听读就绪事件
*/
SelectionKey selectionKey = chennel.register(selector, SelectionKey.OP_READ);

/**
* 代码片段3:阻塞等待channel有就绪事件发生
*/
int selectNum = selector.select();

/**
* 代码片段4:获取发生就绪事件的channel集合
*/
Set<SelectionKey> selectedKeys = selector.selectedKeys();

SelectionKey简介

  • 四种就绪状态常量:Connected,Accept,Read , Write
  • 有价值的属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值