# Socket回顾与IO模型


<!--more-->

#Socket回顾与IO模型

示例代码：[https://gitee.com/ixinglan/rpc-demo.git](https://gitee.com/ixinglan/rpc-demo.git)

## 1.socket网络编程回顾

### 1.1 socket概述

Socket，套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议，主要解决数据如何在网络中传输，而HTTP是应用层协议，主要解决如何包装数据。Socket是通信的基石，是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示，包含进行网络通信必须的五种信息：连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。

### 1.2 socket整体流程

Socket编程主要涉及到客户端和服务端两个方面，首先是在服务器端创建一个服务器套接字（ServerSocket），并把它附加到一个端口上，服务器从这个端口监听连接。端口号的范围是0到65536，但是0到1024是为特权服务保留的端口号，可以选择任意一个当前没有被其他进程使用的端口。

客户端请求与服务器进行连接的时候，根据服务器的域名或者IP地址，加上端口号，打开一个套接字。当服务器接受连接后，服务器和客户端之间的通信就像输入输出流一样进行操作。

![img](https://img.zhaojq.top/20260727091824389.png "img")

### 1.3 代码实现

**示例代码：socket-demo**



## 2.I/O模型

### 2.1 io模型说明

I/O 模型简单的理解：就是用什么样的通道进行数据的发送和接收，很大程度上决定了程序通信的性能

Java 共支持 3 种网络编程模型/IO 模式：**BIO(同步并阻塞)**、**NIO(同步非阻塞)**、**AIO(异步非阻塞)**

阻塞与非阻塞：主要指的是访问IO的线程是否会阻塞（或处于等待），线程访问资源，该资源是否准备就绪的一种处理方式

同步和异步：主要是指的数据的请求方式，同步和异步是指访问数据的一种机制

![img_1](https://img.zhaojq.top/20260727091824700.png "img_1")



### 2.2 BIO（同步阻塞）

java BIO就是传统的 socket编程.

BIO(blocking I/O) ： 同步阻塞，服务器实现模式为一个连接一个线程，即客户端有连接请求时服务器端就需要启动一个线程进行处理，如果这个连接不做任何事情会造成不必要的线程开销，可以通过线程池机制改善(实现多个客户连接服务器)。

工作机制：

![img_2](https://img.zhaojq.top/20260727091825099.png "img_2")

问题分析：

- 每个请求都需要创建独立的线程，与对应的客户端进行数据 Read，业务处理，数据 Write
- 并发数较大时，需要创建大量线程来处理连接，系统资源占用较大
- 连接建立后，如果当前线程暂时没有数据可读，则线程就阻塞在 Read  操作上，造成线程资源浪费

### 2.3 NIO（同步非阻塞）

同步非阻塞，服务器实现模式为一个线程处理多个请求(连接)，即客户端发送的连接请求都会注册到多路复用器上，多路复用器轮询到连接有 I/O 请求就进行处理

![img_3](https://img.zhaojq.top/20260727091825308.png "img_3")

### 2.4 AIO（异步非阻塞）

AIO 引入异步通道的概念，采用了 Proactor 模式，简化了程序编写，有效的请求才启动线程，它的特点是先由操作系统完成后才通知服务端程序启动线程去处理，一般适用于连接数较多且连接时间较长的应用

> Proactor 模式是一个消息异步通知的设计模式，Proactor 通知的不是就绪事件，而是操作完成事件，这也就是操作系统异步 IO 的主要模型。

### 2.5 BIO,NIO,AIO适用场景分析  

- BIO(同步并阻塞) 方式适用于连接数目比较小且固定的架构，这种方式对服务器资源要求比较高，并发局限于应用中，JDK1.4以前的唯一选择，但程序简单易理解
- NIO(同步非阻塞) 方式适用于连接数目多且连接比较短（轻操作）的架构，比如聊天服务器，弹幕系统，服务器间通讯等。编程比较复杂，JDK1.4 开始支持
- AIO(异步非阻塞) 方式适用于连接数目多且连接比较长（重操作）的架构，比如相册服务器，充分调用 OS 参与并发操作， 编程比较复杂，JDK7 开始支持。


































