JavaNIO编程基础-图解JavaNIO内存模型
1、网络通信基础
网络通信就是客户端和服务端发送和接收数据的过程
计算机主机通信 |
---|
一个客户端要发起一次网络通信,必须先知道服务端的IP地址,然后 “网络基础设施” 通过 IP 地址将客户端发送的信息传递到 IP 地址对应的主机上。
通过 IP 可以找到主机,但将消息发送到主机中的具体应用程序需要通过端口号
2、JavaNIO 网络通信
上面提到的概念,在Java中都有其对应的抽象
比如:
1、InetSocketAddress
抽象了IP、端口号;
2、SocketChannel
抽象了 通信端点;
3、ServerSocketChannel
抽象了服务端功能,即在服务端创建 SocketChannel
与客户端进行通信;
Java中除了上述的比较几个抽象,其实还有一些内部处理部件的抽象,比如 Selector
、SelectionKey
…
2.1 服务端初始化
⭐️ ⭐️ 为了方便,下文很多地方会采用简写:
ssc
表示 ServerSocketChannel
sel
表示 Selector
sc
表示 SocketChannel
进行网络通信首先需要启动服务端,这样才能来接收客户端的连接请求、建立连接并进行通信。
1、创建 ServerSocketChannel
创建 ServerSocketChannel
来监听指定的通信端口
ServerSocketChannel ssc = ServerSocketChannel.open();ssc.bind(new InetSocketAddress(9000));
2、创建 Selector(选择器)
创建 Selector
(选择器)用来选择就绪的请求
Selector sel = Selector.open();
3、向 Selector 注册 ServerSocketChannel
调用 ServerSocketChannel.register(Selector,SelectionKey.OP_ACCEPT)
方法将 ServerSocketChannel
注册进 Selector
,注册方法的返回结果是SelectionKey
类型。
ssc.configureBlocking(false);// 设置为非阻塞模式SelectionKey sk = ssc.register(sel, SelectionKey.OP_ACCEPT);
sk
中持有 ssc
和 sel
的引用,并且这个 sk
关注的操作是 OP_ACCEPT
从语义上看,是将Selector 注册到 ServerSocketChannel 中,实际上在 register 方法的源码中是将 二者封装成 SelectionKey 并放入 Selector中的 Set 中。
下图描述了初始化的过程:
初始化的过程 |
---|
注:有关Selector等内部原理的代码,篇幅所限,大家自行查看源码
我们这里提一下JavaNIO网络通信的基础知识。
熟悉Java基础知识的同学应该知道,Java API里有很多native方法,这些native方法使用 c语言来实现的,主要是因为OS大多采用C语言来写的,如果Java需要操作系统提供的功能支持,这就需要使用native方法,下图是Java网络应用 与 OS、硬件的交互示意图
Java应用 、OS、硬件的交互示意图 |
---|
网络通信需要OS网络通信相关的系统调用提供支持,比如绑定端口、监听端口、选择就绪请求等…
JavaNIO编程基础-图解JavaNIO内存模型相关推荐
- 一篇文章弄懂Java多线程基础和Java内存模型
文章目录 一.多线程的生命周期及五种基本状态 二.Java多线程的创建及启动 1.继承Thread类,重写该类的run()方法 2.通过实现Runnable接口创建线程类 3.通过Callable和F ...
- 高并发编程-重新认识Java内存模型(JMM)
文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...
- java内存图解_图解JAVA内存模型(JMM:JAVA Memory Model)
本文主要说明两个问题:JMM存在的意义是什么?JMM内部的工作原理是什么(重点讲一下并发编程模式下的数据访问一致性问题) . 1.为什么要使用JMM? 当我们刚开始接触JAVA语言的时候,就会被告知J ...
- c++ 线程什么时候run_多线程并发支撑基础之JAVA内存模型
Java内存模型可以说是Java并发的底层支持,了解Java内存模型才能正在了解Java并发. 内存模型 在内存中设置一个变量"value = 1:"那么其他线程能在什么时候读取到 ...
- java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型
左图为高速缓存 右图为多级缓存 数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道.主存与高速缓存都是连接在系统总线上,当然其他组件也是在此基础上进行通信的. 在高速缓存出现后不 ...
- 图解JVM--(四)内存模型
内存模型 java 内存模型 很多人将[java 内存结构]与[java 内存模型]傻傻分不清,[java 内存模型]是 Java Memory Model(JMM)的意思. 简单的说,JMM 定义了 ...
- Java高并发编程详解系列-内存模型
volatile关键字介绍,要了解volatile需要了解的还有Java内存模型,以及CPU内存模型等知识.首先从CPU和Java内存模型开始说起. CPU Cache模型 在之前的时候,分享过一 ...
- JAVA线程两种方法内存,JAVA线程基础回顾及内存模型(一)
线程创建的两种方式 继承Thread类 class MyThread extends Thread{ ...... @Override public void run(){ ...... } } My ...
- java基础之java内存模型
1.原子性 问题:i++是原子性没? 不是! 我理解原子性是针对计算机指令而言的,i++包含读.加和写操作,包含三指令! 除此之外,32位计算机读取64位的也不是原子性! 2.有序性 并发时 可能出现 ...
最新文章
- 使用C++访问MySQL数据库(VS2019)
- opcuaclient 文档_连接协议-OPC UA Client
- CentOS查看软件源提供的软件版本命令
- SAP UI5 System Test 的工具之一:uiveri5
- sublimelinter-php 错误代码提示
- java map byte[],java中byte数组不能作为map的key使用
- ASP.NET跨页传值方法汇总
- 关于这道填空题,你会如何回答?(附带学习链接)
- ajax怎么找回地址栏,使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL...
- Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队算法
- html展示值 vue_vue在html使用
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
- 数字证书及CA的详细理解
- 16.Linux网络编程
- 图扑软件基于钻孔数据的三维地质模型可视化
- 视频直播产业的下半场,谁会走谁会留?
- 炉石无限重新连接服务器,炉石传说:竟然还有这种无限资源的操作
- WebSocket connection to ‘wss://xxx.com’ failed: Error in NET::ERR_SSL_OBSOLETE_VERSION
- IAR更改更改字体的办法,完美解决!
- HTML网页设计制作大作业(div+css)---浩瀚天文 (13页有二级菜单)
热门文章
- linux 多个makefile,linux – 具有多个目标的Makefile
- c语言指针选择排序1,求助利用指针进行选择排序
- STM32编译环境、建立工程模板以及程序下载
- java代码中的缓存类怎么找,JAVA缓存的实现 - dreamcloudz的个人空间 - OSCHINA - 中文开源技术交流社区...
- php 的cookie设置时间,php cookie时间设置的方法
- ibatis调用mysql带OUT类型参数的存储过程并获取返回值
- 调侃面向对象编程的23种设计模式
- 揪出数据库中看不见的字符
- servlet ---- EL表达式
- 动态改变类名_反调试之检测类名与标题名