1、网络通信基础

网络通信就是客户端和服务端发送和接收数据的过程

计算机主机通信

一个客户端要发起一次网络通信,必须先知道服务端的IP地址,然后 “网络基础设施” 通过 IP 地址将客户端发送的信息传递到 IP 地址对应的主机上。

通过 IP 可以找到主机,但将消息发送到主机中的具体应用程序需要通过端口号

2、JavaNIO 网络通信

上面提到的概念,在Java中都有其对应的抽象

比如:
1、InetSocketAddress 抽象了IP、端口号;

2、SocketChannel 抽象了 通信端点;

3、ServerSocketChannel 抽象了服务端功能,即在服务端创建 SocketChannel 与客户端进行通信;

Java中除了上述的比较几个抽象,其实还有一些内部处理部件的抽象,比如 SelectorSelectionKey

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 中持有 sscsel 的引用,并且这个 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内存模型相关推荐

  1. 一篇文章弄懂Java多线程基础和Java内存模型

    文章目录 一.多线程的生命周期及五种基本状态 二.Java多线程的创建及启动 1.继承Thread类,重写该类的run()方法 2.通过实现Runnable接口创建线程类 3.通过Callable和F ...

  2. 高并发编程-重新认识Java内存模型(JMM)

    文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...

  3. java内存图解_图解JAVA内存模型(JMM:JAVA Memory Model)

    本文主要说明两个问题:JMM存在的意义是什么?JMM内部的工作原理是什么(重点讲一下并发编程模式下的数据访问一致性问题) . 1.为什么要使用JMM? 当我们刚开始接触JAVA语言的时候,就会被告知J ...

  4. c++ 线程什么时候run_多线程并发支撑基础之JAVA内存模型

    Java内存模型可以说是Java并发的底层支持,了解Java内存模型才能正在了解Java并发. 内存模型 在内存中设置一个变量"value = 1:"那么其他线程能在什么时候读取到 ...

  5. java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型

    左图为高速缓存 右图为多级缓存 数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道.主存与高速缓存都是连接在系统总线上,当然其他组件也是在此基础上进行通信的. 在高速缓存出现后不 ...

  6. 图解JVM--(四)内存模型

    内存模型 java 内存模型 很多人将[java 内存结构]与[java 内存模型]傻傻分不清,[java 内存模型]是 Java Memory Model(JMM)的意思. 简单的说,JMM 定义了 ...

  7. Java高并发编程详解系列-内存模型

    volatile关键字介绍,要了解volatile需要了解的还有Java内存模型,以及CPU内存模型等知识.首先从CPU和Java内存模型开始说起. CPU Cache模型   在之前的时候,分享过一 ...

  8. JAVA线程两种方法内存,JAVA线程基础回顾及内存模型(一)

    线程创建的两种方式 继承Thread类 class MyThread extends Thread{ ...... @Override public void run(){ ...... } } My ...

  9. java基础之java内存模型

    1.原子性 问题:i++是原子性没? 不是! 我理解原子性是针对计算机指令而言的,i++包含读.加和写操作,包含三指令! 除此之外,32位计算机读取64位的也不是原子性! 2.有序性 并发时 可能出现 ...

最新文章

  1. 使用C++访问MySQL数据库(VS2019)
  2. opcuaclient 文档_连接协议-OPC UA Client
  3. CentOS查看软件源提供的软件版本命令
  4. SAP UI5 System Test 的工具之一:uiveri5
  5. sublimelinter-php 错误代码提示
  6. java map byte[],java中byte数组不能作为map的key使用
  7. ASP.NET跨页传值方法汇总
  8. 关于这道填空题,你会如何回答?(附带学习链接)
  9. ajax怎么找回地址栏,使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL...
  10. Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队算法
  11. html展示值 vue_vue在html使用
  12. Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
  13. 数字证书及CA的详细理解
  14. 16.Linux网络编程
  15. 图扑软件基于钻孔数据的三维地质模型可视化
  16. 视频直播产业的下半场,谁会走谁会留?
  17. 炉石无限重新连接服务器,炉石传说:竟然还有这种无限资源的操作
  18. WebSocket connection to ‘wss://xxx.com’ failed: Error in NET::ERR_SSL_OBSOLETE_VERSION
  19. IAR更改更改字体的办法,完美解决!
  20. HTML网页设计制作大作业(div+css)---浩瀚天文 (13页有二级菜单)

热门文章

  1. linux 多个makefile,linux – 具有多个目标的Makefile
  2. c语言指针选择排序1,求助利用指针进行选择排序
  3. STM32编译环境、建立工程模板以及程序下载
  4. java代码中的缓存类怎么找,JAVA缓存的实现 - dreamcloudz的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. php 的cookie设置时间,php cookie时间设置的方法
  6. ibatis调用mysql带OUT类型参数的存储过程并获取返回值
  7. 调侃面向对象编程的23种设计模式
  8. 揪出数据库中看不见的字符
  9. servlet ---- EL表达式
  10. 动态改变类名_反调试之检测类名与标题名