修复图片资源问题
@ -708,7 +708,7 @@ int main()
|
|||||||
|
|
||||||
面向对象程序设计(Object-oriented programming,OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。
|
面向对象程序设计(Object-oriented programming,OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。
|
||||||
|
|
||||||
![图片](https://mmbiz.qpic.cn/mmbiz_png/kChlCQZAfH5FqDts5YrdZGE45XzVJudXRcRILjlpAIuhvY3jR92az84fibr0icTn6WH5Alo2Vxdrh1HMVnaMxdhQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)面向对象特征
|
![图片](images/640.webp)面向对象特征
|
||||||
|
|
||||||
面向对象三大特征 —— 封装、继承、多态
|
面向对象三大特征 —— 封装、继承、多态
|
||||||
|
|
||||||
@ -1220,7 +1220,7 @@ class doSomething(Flyable *obj) // 做些事情
|
|||||||
>
|
>
|
||||||
> #### Google C++ Style Guide 图
|
> #### Google C++ Style Guide 图
|
||||||
|
|
||||||
![图片](https://mmbiz.qpic.cn/mmbiz_png/kChlCQZAfH5FqDts5YrdZGE45XzVJudXSb48q1TO1UwsBmib9bSAWfLdF4rOfJNbf7HwQrLeCRvzvIibXpd737LQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
|
![图片](images/650.webp)
|
||||||
|
|
||||||
> 图片来源于:CSDN . 一张图总结Google C++编程规范(Google C++ Style Guide)
|
> 图片来源于:CSDN . 一张图总结Google C++编程规范(Google C++ Style Guide)
|
||||||
|
|
||||||
@ -1647,7 +1647,7 @@ typedef struct BiTNode
|
|||||||
|
|
||||||
#### 八叉树图片
|
#### 八叉树图片
|
||||||
|
|
||||||
![图片](https://mmbiz.qpic.cn/mmbiz_png/kChlCQZAfH5FqDts5YrdZGE45XzVJudXgibemJh7kI2KuG7IuADenHTWm8XZRE1AwEIbczibHbR03rtibCibibxLEKw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
|
![图片](images/660.webp)
|
||||||
|
|
||||||
八叉树(octree),或称八元树,是一种用于描述三维空间(划分空间)的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点作为节点的分叉中心。
|
八叉树(octree),或称八元树,是一种用于描述三维空间(划分空间)的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点作为节点的分叉中心。
|
||||||
|
|
||||||
@ -2459,7 +2459,7 @@ ssize_t write(int fd, const void *buf, size_t count);
|
|||||||
|
|
||||||
只有就完了三次握手,但是这个三次握手发生在 Socket 的那几个函数中呢?请看下图:
|
只有就完了三次握手,但是这个三次握手发生在 Socket 的那几个函数中呢?请看下图:
|
||||||
|
|
||||||
![图片](https://mmbiz.qpic.cn/mmbiz_png/kChlCQZAfH5FqDts5YrdZGE45XzVJudXU3CYC5EU3tKckJvC4XB2vaUpFyFvKNiaQ8k5icVONibnILdyXpIlvPBYA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)socket 中发送的 TCP 三次握手
|
![图片](images/670.webp)socket 中发送的 TCP 三次握手
|
||||||
|
|
||||||
从图中可以看出:
|
从图中可以看出:
|
||||||
|
|
||||||
@ -2472,7 +2472,7 @@ ssize_t write(int fd, const void *buf, size_t count);
|
|||||||
|
|
||||||
上面介绍了 socket 中 TCP 的三次握手建立过程,及其涉及的 socket 函数。现在我们介绍 socket 中的四次握手释放连接的过程,请看下图:
|
上面介绍了 socket 中 TCP 的三次握手建立过程,及其涉及的 socket 函数。现在我们介绍 socket 中的四次握手释放连接的过程,请看下图:
|
||||||
|
|
||||||
![图片](https://mmbiz.qpic.cn/mmbiz_png/kChlCQZAfH5FqDts5YrdZGE45XzVJudXxNJlh5gfLcegmkogu0QWWl1LT5mD5E2bEhQtNlYRMhB6PnrOtVuUPw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)socket 中发送的 TCP 四次握手
|
![图片](images/680.webp)socket 中发送的 TCP 四次握手
|
||||||
|
|
||||||
图示过程如下:
|
图示过程如下:
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 7.2 KiB |
@ -20,7 +20,7 @@ date: 2022-02-07 00:00:00
|
|||||||
|
|
||||||
运行期多态的设计思想要归结到类继承体系的设计上去。对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,在基类中将这些功能声明为虚接口(虚函数),然后由子类继承基类去重写这些虚接口,以实现子类特有的具体功能。典型地我们会举下面这个例子:
|
运行期多态的设计思想要归结到类继承体系的设计上去。对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,在基类中将这些功能声明为虚接口(虚函数),然后由子类继承基类去重写这些虚接口,以实现子类特有的具体功能。典型地我们会举下面这个例子:
|
||||||
|
|
||||||
![图片](https://gitee.com/zyjblog/img/raw/master/md/2021-9-30-640.png)
|
![图片](images/2021-9-30-640.png)
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
class Animal
|
class Animal
|
||||||
|
After Width: | Height: | Size: 8.1 KiB |
@ -42,7 +42,7 @@ date: 2021-08-13 00:00:00
|
|||||||
|
|
||||||
BIO通信(一请求一应答)模型图如下(图源网络,原出处不明):
|
BIO通信(一请求一应答)模型图如下(图源网络,原出处不明):
|
||||||
|
|
||||||
![传统BIO通信模型图](./img/2.png)
|
![传统BIO通信模型图](images/2.png)
|
||||||
|
|
||||||
采用 **BIO 通信模型** 的服务端,通常由一个独立的 Acceptor 线程负责监听客户端的连接。我们一般通过在`while(true)` 循环中服务端会调用 `accept()` 方法等待接收客户端的连接的方式监听请求,请求一旦接收到一个连接请求,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成, 不过可以通过多线程来支持多个客户端的连接,如上图所示。
|
采用 **BIO 通信模型** 的服务端,通常由一个独立的 Acceptor 线程负责监听客户端的连接。我们一般通过在`while(true)` 循环中服务端会调用 `accept()` 方法等待接收客户端的连接的方式监听请求,请求一旦接收到一个连接请求,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成, 不过可以通过多线程来支持多个客户端的连接,如上图所示。
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ BIO通信(一请求一应答)模型图如下(图源网络,原出处不明)
|
|||||||
|
|
||||||
伪异步IO模型图(图源网络,原出处不明):
|
伪异步IO模型图(图源网络,原出处不明):
|
||||||
|
|
||||||
![伪异步IO模型图](http://study.zyjblogs.cn/3.png)
|
![伪异步IO模型图](images/3.png)
|
||||||
|
|
||||||
采用线程池和任务队列可以实现一种叫做伪异步的 I/O 通信框架,它的模型图如上图所示。当有新的客户端接入时,将客户端的 Socket 封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK 的线程池维护一个消息队列和 N 个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。
|
采用线程池和任务队列可以实现一种叫做伪异步的 I/O 通信框架,它的模型图如上图所示。当有新的客户端接入时,将客户端的 Socket 封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK 的线程池维护一个消息队列和 N 个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ NIO有选择器,而IO没有。
|
|||||||
|
|
||||||
选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。
|
选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。
|
||||||
|
|
||||||
![一个单线程中Selector维护3个Channel的示意图](./img/Slector.png)
|
![一个单线程中Selector维护3个Channel的示意图](images/Slector.png)
|
||||||
|
|
||||||
### 2.3 NIO 读数据和写数据方式
|
### 2.3 NIO 读数据和写数据方式
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ NIO有选择器,而IO没有。
|
|||||||
|
|
||||||
数据读取和写入操作图示:
|
数据读取和写入操作图示:
|
||||||
|
|
||||||
![NIO读写数据的方式](./img/NIO读写数据的方式.png)
|
![NIO读写数据的方式](images/NIO读写数据的方式.png)
|
||||||
|
|
||||||
### 2.4 NIO核心组件简单介绍
|
### 2.4 NIO核心组件简单介绍
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |