自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

拖地的服务生

要想练就绝世武功 就要忍受常人难忍受的痛

  • 博客(21)
  • 收藏
  • 关注

原创 5.不完全的 NioEventLoopGroup & NioEventLoop 源码分析

NioEventLoopGroup在 4.一个简单的 Netty 服务端 文章中, 创建服务端时需要先实例化两个 NioEventLoopGroup 分别为 bossGroup 和 workerGroup.bossGroup: 只是处理连接请求.workerGroup: 处理客户端业务逻辑.上图是该类的继承关系, 我个人觉得没必要去了解完全这些类的作用, 只需要记住几个重点类就可以了.EventExecutorGroup该接口虽然继承了 java.util.concurrent.Sched

2020-06-21 21:20:27 199

原创 4.一个简单的 Netty 服务端

阿萨德

2020-06-18 13:57:04 124

原创 3. Netty 模型

关于 2.线程模型概述 有人问能回答上来就可以了.但是对于 Netty 模型来说, 一定要了解透彻后才继续学习.下面的图是我自己根据网上疯传的一种一张 Netty 模型图改的, 看着是不是有点像 主从 Reactor 多线程.Netty 抽象出了两组线程池, BossGroup 专门用来处理客户端连接, WorkerGroup 专门负责网络读写. 这两组线程池的类型为 NioEventLoopGroup.每一个 NioEventLoopGroup 都包含一个或多个 NioEventLoop, Ni

2020-06-17 21:03:15 128

原创 2.线程模型概述

目前存在的线程模型有:传统阻塞 IO 服务模型Reactor 模式, 根据 Reactor 数量和处理资源池线程的数量不同, 又有 3 重典型的实现.单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程.传统阻塞 IO 服务模型一个线程对应一个客户端, 如果客户端过多就会占用很大的系统资源.没有可读数据时, 线程会阻塞, 造成资源浪费.Reactor 模式下图只是对 Reactor 模式的一个整体理念, 当涉及到三个具体实现时, 有不同的变化.

2020-06-17 14:39:44 178

原创 1.Netty 概述

原生 NIO 存在的问题NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握 Selector, ServerSocketChannel, SocketChannel, ByteBuffer 等.需要具备其它的额外技能: 要熟悉 Java 多线程编程, 因为 NIO 涉及到 Reactor(反应器) 模式.开发工作量和难度非常大: 例如客户端面临断线重连, 网络闪断, 半包读写, 失败缓存, 网络阻塞和异常流的处理.NettyNetty 是一个 异步 事件驱动 网络应用框架. 用来快速

2020-06-16 21:15:32 141

原创 16.Selector 选择器

多个 Channel 注册到同一个 Selector 上, Selector 能检测通道上是否有事件发生, 如果有事件发生, 便获取事件然后针对每个事件进行相应的处理.这样就可以只用一个单线程去管理多个通道, 也就是管理多个连接和请求.只有在连接真正有读写事件发生时, 才会进行读写, 就大大地减少了系统的开销, 而且不必为每个连接都创建一个线程, 不用去维护多个线程, 避免了多线程之间的上下文切换导致的开销.下面是 java.nio.channels.Selector 的继承关系.该类就是具体选择

2020-06-14 15:06:36 275

原创 15.Channel 通道

通道表示对文件、Socket 的连接或者是能够执行 I/O 操作的程序组件.NIO 的通道类似于流, 但是有些区别:通道可以同时进行读写, 而流只能读或只能写.通道可以实现异步读写数据.通道可以从缓冲区读数据, 也可以写数据到缓冲区.Channel 是 NIO 中的一个接口public interface Channel extends Closeable {}常用的 Channel 类有:FileChannel: 用于文件的数据读写.DatagramChannel: 用于 UDP

2020-06-13 20:29:38 7701

原创 14.Buffer 缓冲区

缓冲区(Buffer): 缓冲区本质上是一个可以读写数据的内存块, 可以理解成是一个容器对象(含数组), 该对象提供了一组方法, 可以更轻松的使用内存块, 缓冲区对象内置了一些机制, 能够跟踪和记录缓冲区的状态变化情况.在 NIO摘要中的举例说明 Buffer 使用 有做个一个 BasicBuffer 的简单例子.这里并不会针对源码做详细分析, 而是解释 Buffer 的主要属性以及常用方法等.如下图, 在 Java 中 Buffer 一共有如下子类以 IntBuffer 为例, 其中包含了一个

2020-06-13 20:22:51 430

原创 13.NIO 摘要

NIO 相关类都被放在 java.nio 包及子包下, 并对原 java.io 包中的很多类进行改写.NIO 有三大核心部分: Channel 通道, Buffer 缓冲区, Selector 缓冲区.通道可以理解为 BIO 中的 Socket 连接, 每个通道又对应一个缓存区, 在读/写数据时都是针对缓冲区进行操作.NIO 是面向缓冲区或者面向块编程(数据都是按照块进行组织和管理). 数据读取到缓冲区, 需要时可以在缓冲区中前后移动, 这就增加了处理过程中的灵活性, 使用它可以提供非阻塞式的高伸缩网

2020-06-13 20:15:05 194

原创 12.BIO详解

Java BIO 就是传统的 java io 编程, 其相关的类和接口在 java.io 中.BIO 编程简单流程服务器端启动一个 ServerSocket.客户端启动 Socket 对服务器进行通讯, 默认情况下服务器需要对每个客户建立一个县线程与之通讯.客户端发出请求后, 先咨询服务器是否有线程响应, 如果没有则会等待, 或者被拒绝.如果有响应, 客户端线程会等待请求结束后才继续执行.Java BIO 应用实例import java.io.IOException;import jav

2020-06-13 19:43:31 187

原创 11.Java IO 模型

I/O 模型简单的理解: 就是数据的发送和接收使用哪种通道, 这个通道决定了程序通讯性能.Java 共支持3中网络编程模型: BIO NIO AIO.BIO特点: BIO 是 blocking I/O, 同步阻塞, 就是传统的 Java 原生阻塞模型.采用 BIO 通信模型的服务端, 通常由一个独立的 Acceptor 线程负责监听客户端的连接, 它接收到客户端连接请求之后 为每个客户端创建一个新的线程进行链路处理, 处理完成之后, 通过输出流返回应答给客户端, 线程销毁. 这就是典型的一请求一

2020-06-12 17:22:38 112

原创 10.select poll epoll

#include <sys/select.h> int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);在 Linux 中, 我们可以使用 select 函数实现 I/O 复用, 给 select 函数传递的参数会告诉内核:我们所关心的文件描述符对每个描述符, 我们所关心的状态(读 写 异常).我们要等待多长时间(我们可以等待无限长

2020-06-12 17:06:52 101

原创 9.Linux网络编程中的五种I/O模型讲解

IO 操作分为两步: 发起 IO 请求等待数据准备, 实际 IO 操作.例如:操作系统的一次写操作分为两步: 将数据从用户空间拷贝到系统空间; 从系统空间往网卡写.一次读操作分为两步: 将数据从网卡拷贝到系统空间; 将数据从系统空间拷贝到用户空间.当调用 IO 函数 (recv()/recvfrom()) 时, 首先系统先检查是否准备好数据. 如果数据没有准备好, 那么系统就处于等待状态. 当数据准备好后, 将数据从系统缓冲区复制到用户空间, 然后该函数返回.例如 socket 服务端读取客

2020-06-12 17:00:43 187

原创 8.阻塞/非阻塞 同步/异步

值得注意的是:阻塞非阻塞是针对进程或者线程的调用结果来说的.而同步或者非同步则是针对代码的调用结果来说.阻塞文件读取操作File file = new File("D:\\iotest.txt");InputStream in = new FileInputStream(file);byte[] bytes = new byte[10];int c;while((c=in.read(bytes))!=-1) { System.out.println(Arrays.toStrin

2020-06-12 16:32:26 92

原创 7.RFC

RFC (Request for Comment) 文档是所有以太网协议的正式标准, 并在其官网上面公布, 由 IETF 标准协会制定.大量的 RFC 并不是正式的标准, 出版的目的只是为了提供信息. RFC 的篇幅不一, 从几页到几百页不等. 每一种协议都用一个数字来标识, 如 RFC 3720 是 iSCSI 协议的标准, 数字越大意味着 RFC 的内容越新或者是对应的协议 (标准) 出现的比较晚.所有的 RFC 文档都可以从网络上找到, 其官网为IETF. 在网站上面可以通过分类以及搜索快速找到目

2020-06-12 16:27:54 208

原创 6.封装和分用

封装: 当应用程序发送数据的时候, 数据在协议层次当中从顶向下通过每一层, 每一层都会对数据增加一些首部或尾部信息, 这样的信息称之为协议数据单元 (Protocol Data Unit, 缩写为PDU), 在分层协议系统里, 在指定的协议层上传送的数据单元, 包含了该层的协议控制信息和用户信息.如下图所示:物理层 (一层) PDU 指数据位 (Bit)数据链路层 (二层) PDU 指数据帧 (Frame)网络层 (三层) PDU 指数据包 (Packet)传输层 (四层) PDU 指数据段 (

2020-06-12 16:27:00 274

原创 5.端口号

IP 地址是用来发现和查找网络中的地址, 但是不同程序如何互相通信呢? 这就需要端口号来识别了.如果把 IP 地址比作一间房子, 端口就是出入这间房子的门. 真正的房子只有几个门, 但是端口采用 16 比特的端口号标识, 一个 IP 地址的端口可以有 65536 (即:2^16) 个之多!服务器的默认程序一般都是通过人们所熟知的端口号来识别的. 例如, 对于每个 TCP/IP 实现来说, SMTP (简单邮件传输协议) 服务器的 TCP 端口号都是 25, FTP (文件传输协议) 服务器的 TCP 端

2020-06-12 16:25:17 195

原创 4.MAC 地址

MAC (Media Access Control) 地址, 或称为物理地址、硬件地址, 用来定义互联网中设备的位置.在 TCP/IP 层次模型中, 网络层管理 IP 地址, 链路层则负责 MAC 地址.因此每个网络位置会有一个专属于它的 IP 地址, 而每个主机会有一个专属于它 MAC 地址....

2020-06-12 16:23:38 135

原创 3.域名

用 12 位数字组成的 IP 地址很难记忆, 在实际应用时, 用户一般不需要记住 IP 地址, 互联网给每个 IP 地址起了一个别名, 习惯上称作域名.域名与计算机的 IP 地址相对应,并把这种对应关系存储在域名服务系统 DNS(Domain Name System) 中, 这样用户只需记住域名就可以与指定的计算机进行通信了.我们可以使用命令 nslookup 或者 ping 来查看与域名相对应的 IP 地址, 由于实验楼网络限制, 我们可以使用 ping github.com....

2020-06-12 16:22:07 103

原创 2.IP 地址

网络上每一个节点都必须有一个独立的 IP 地址, 通常使用的 IP 地址是一个 32bit 的数字, 被 . 分成 4 组, 例如, 255.255.255.255 就是一个 IP 地址.有了 IP 地址, 用户的计算机就可以发现并连接互联网中的另外一台计算机.在 Linux 系统中, 可以用 ifconfig -a 命令查看自己的 IP 地址:...

2020-06-12 16:19:49 243

原创 1.TCP/IP 背景和介绍

TCP/IP (Transmission Control Protocol/Internet Protocol) 是传输控制协议和网络协议的简称, 它定义了电子设备如何连入因特网, 以及数据如何在它们之间传输的标准.TCP/IP 不是一个协议, 而是一个协议族的统称, 里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3 协议等. 网络中的计算机都采用这套协议族进行互联.网络协议栈架构提到网络协议栈结构, 最著名的当属 OSI 七层模型, 但是 TCP/IP 协议族

2020-06-12 15:59:58 665

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除