java NIO网络编程
NIO介绍
NIO即no-blocking IO,表示同步非阻塞IO操作。采用多路复用器,事件驱动机制,当发生io请求时,触发相应的事件,多路复用器中的轮询器即selector轮询到事件,从而交由线程执行。请求发起方发起请求之后并不会被堵塞,可以设置为非堵塞的状态。
三大核心组件
java nio框架中,有三大核心的组件:Buffer、Channel、Selector。其关系图为:
Buffer
buffer即数据缓冲区,用于存储发送或读取Channel中的数据。数据流向是双向的,读写模式的切换需要依赖filp()方法。Buffer中重要的的几个属性。
- position: 表示当前读取或写入的索引位置。
- limit:表示当前读取或写入的限制索引位置。(position <= limit)
- capacity: 表示缓冲区的容量。
buffer中操作数据的方法有:get()
读取position位置的数据,put()
将数据写入position索引位置。array()
直接返回buffer中的数组(数组是final修饰的)。需要注意的是,buffer并不会真正删除数据,而是通过position,limit属性来控制读取和写入的位置,大小。例如,buffer数组初始化时,position为0,limit=capacity。当写入一个数据时,position+1。但需要读取时,如果不仅进行模式切换,此时将从position处开始读取,读取错误的信息。
filp方法是将limit = position ,postion=0等操作,从而限制只能读取写入的数据。
另一个方法clear()方法,将position = 0; limit = capactiy.
buffer的一些实现类如:ByteBuffer、CharBuffer、IntegerBuffer、LongBuffer。操作流程大同小异。
Channel
channel是连接selector的信道,传输信息数据,同时channel需要绑定到selector。
channel重要的种类有:
- FileChannel:操作文件
- SocketChannel:负责tcp的网络套接字
- ServerSockerChannel:负责tcp网络服务端。
- DatagramChannel:负责UDP通信
channel中的重要方法:
configBlocking(boolean)
: 配置该信道是否阻塞。register(Selector,Int)
用来绑定selector和事件。read(Buffer)
将channel信道中的数据读入到该buffer中
SelectionKey
如果说channel是一条管道,SelectionKey就是一个连接器。一个SelectionKey不仅将一个channel和selector绑定,还将channel触发事件绑定在selector中。SlectionKey中定义的几种事件常量:
- OP_READ:读事件。
- OP_WRITE::写事件。
- OP_CONNECT:套接字连接事件。
- OP_ACCEPT:套接字接收事件。
SelectionKey的几个重要方法:
cannel()
:返回该SelectionKey绑定的Channelselector()
:返回该SlectionKey绑定的SelectorisReadable():
判断是否为可读事件。isWritable():
判断是否为可写事件。isConnectable()
: 判断是否为连接事件。isAcceptable():
判断是否为接受事件。
Selector
轮询器。能够不断的轮询出已经触发事件的channel。Selector主要负责事件的轮询,保存并维护多个不同状态的SelectionKey数组。在本人有限的认知下,selector较重要的属性有:
protected Set<SelectionKey> selectedKeys
:存储已经触发过事件的SelectionKeyprotected HashSet<SelectionKey> keys;
:存储注册的SelectionKeyprivate Set<SelectionKey> publicKeys;
:存储当前触发事件的SelectionKeyprivate Set<SelectionKey> publicSelectedKeys;
:存储注册的SelectionKey
他们之间的关系为:
其中publicKeys是keys的不可修改集,publicSelectKeys是selectedKeys的不可成长集。这样做的深意我猜测是为了保护核心数据。
Selector常用的方法有:
selectedKeys()
:返回publicSelectedKeys数组,即当前触发事件的Key。kdys()
:返回当前publicSelectedKeys数组。select()
: 不断轮询数组,返回触发事件的key的个数。(会阻塞,直到出现触发事件)select(long)
: 不断轮询数组,返回触发事件的key的个数,(会阻塞,直到出现触发事件或long型的变量的时间到)selectNow()
: 轮询数组,返回触发事件的key的个数,(不会阻塞)
需要注意的是,在通过selectedKeys方法返回触发事件的keys数组中,需要使用iterator来进行key的遍历,切记:在处理完该事件之后需要调用iterator.remove()方法去删除selectedKeys中的对应key,否则,下次仍然会重复处理这个key。
使用案例
server端:
client端:
另外
从channel.register()的方法中看,channel在注册进selector中去的时候不仅将形成的selectionKey存进selector中,也将该selector存入进channel中的keys数组中去了。
``
java NIO网络编程相关推荐
- 你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)
本文主要讲解NIO的简介.NIO和传统阻塞I/O有什么区别.NIO模型和传统I/O模型之间的对比.以及围绕NIO的三大组件来讲解,理论代码相结合. 很喜欢一句话:"沉下去,再浮上来" ...
- Java NIO网络编程之群聊系统
概述 对ServerSocketChannel.SocketChannel.SelectionKey有一定的理解和了解对应API. NIO非阻塞网络编程相关关系梳理: 以下概念: ServerSock ...
- Netty:Java 领域网络编程的王者
一.简介 1. 课程背景 分布式系统的根基在于网络编程,而 Netty 是 Java 领域网络编程的王者. 2. 课程内容 第一部分 NIO 编程,三大组件 第二部分 Netty 入门学习,Event ...
- NIO网络编程实战之简单多人聊天室
NIO网络编程实战 利用NIO编程知识,实现多人聊天室. 1. NIO编程实现步骤 第一步:创建Selector 第二步:创建ServerSocketChannel,并绑定监听端口 第三步:将Chan ...
- BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程
BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...
- java网络编程技术学习笔记(b站【狂神说Java】网络编程实战讲解)
b站视频链接:[狂神说Java]网络编程实战讲解 文章目录 网络编程 1.1.概述 1.2.网络通信的要素 1.3.IP 1.4.端口 1.5.通信协议 1.6.TCP 文件发送 1.7.UDP 1. ...
- Java(网络编程)
Java(网络编程) 参考视频:1.什么是计算机网络(狂神) 1. 概述 地球村 TCP:打电话 UDP:发短信 计算机网络: 计算机网络是指将地理位置不同的,具有独立功能的,多台计算机及其外部设备, ...
- Netty专题-(3)NIO网络编程
之前在上一章Netty专题-(2)NIO三大核心中介绍了NIO的三大核心类Selector . Channel 和 Buffer,这一章我们将利用这些核心进行编程实现相关的一些功能.在正式进入编程之前 ...
- 你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识
一步一步走来,之前去学习了JUC并发编程知识,现在终于到Java IO网络编程啦,难啊. 一.BIO介绍 引入: 随着技术的发展,两个或以上的程序必然需要进行交互,于是提供了一种端到端的通信,相当于对 ...
- 四十六、深入Java的网络编程(下篇)
@Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
最新文章
- 独家 | 机器学习数据准备技术之旅(附链接)
- 第十六届智能车竞赛比赛进行中 - 参赛队员提出的问题
- Centos mysql的安装和配置
- 【转】小菜硬件杂谈 细数主板上曾出现过的插槽
- 发送json给服务器
- [雪峰磁针石博客]2018最佳人工智能数据采集(爬虫)工具书下载
- 第2章 变量和基本类型 附3---底层const和顶层const
- CentOS通过进程ID查询运行文件的路径方法
- ActiveMQ消息队列
- 低版本 android 软件下载,纳米盒旧版本下载-纳米盒旧版下载4.1安卓版-西西软件下载...
- 链栈(入栈,出栈,遍历)
- vue3.0版本下动态修改表格数据
- CentOs7和leapftp的时候遇到的一些坑
- Java 树形结构数据生成导出excel文件
- animate.css 梦幻西游动画
- Fresher练打字
- 阿里云二级域名配置-ssl证书包不安全问题记录
- 2020亚洲品牌500强榜单发布 ;肯德基中国门店将限时发售植物肉汉堡 | 美通企业日报...
- 一种非Timeline的feeds流架构
- qRT-PCR 注意事项