网络各个层的数据包格式
即一帧就是以上的,如果 数据太大,那么就分成多个 帧 进行发送
java.io
输入与输出: 用法可以这样记 : 读进去(input), 写出来(output)
数据源 到 应用 就是 输入流, 应用到 数据源就是 对应 输出流
字节流即处理字节,也就是 1 byte = 8 bit
字符流高于 字节流 ,虽然操作数据最基本是字节的,但是 字符流这里并不是一个字节一个字节 去读写的,而是一个字符一个字符去读写的。
字符对应Java就是 char (Character) , 1 char 需要 2 byte 去存储
以上是基本的,下面是衍生的复制类,属于包装类:
InputStreamReader 即可将字节转换为字符的作用
OutputStreamReader 将字符转为字节 作用
字节流
以下是包装类
DataInputStream 与DataOutputStream 即可以将字节 转换为对应的 基本类型比如 int ,long
Socket
socket 也是一种数据源。 socket 可以类比为相似现实的 插座, 插上之后就有电流,电流就是IO流
在Unix 系统中 一切皆是文件,因此 socket 也是文件
同步/异步/阻塞/非阻塞
同步或者异步 是 对通信机制上面来说的。即 被调用方的处理结果的形式来说的。
即 被调用方 直接返回结果,就是同步。
如果被调用方 并不会马上返回结果,而是返回一个通知告诉调用方等待结果,然后 处理一段时间之后再返回结果通知调用方 就是 异步。
阻塞与非阻塞对 于 调用方 在获取到结果之前的表现来说的。
如果 调用方在获取到结果之前什么事都不干就是 阻塞式,如果 做了其他事就是非阻塞式的。
因此才会有 同步阻塞,同步非阻塞, 异步阻塞,异步非阻塞 四种通信形式。
NIO
比如 读取,会一直阻塞住,等待消息的的
非阻塞式IO
使用Channel代替Stream ,而stream 是有方向的即 读取和写入。
而 channel 是双向的,既可以读取也可以写入。即有阻塞的读写也有非阻塞的读写
Buffer
channel 的读写通过buffer
channel
selector
selector 管理 channel 和记录 channel 的状态
connect 连接状态, accept 接受连接状态, read 读取, write 写状态
sekectionKey 即 每个channel 标识的ID
通过操作selector 即可。
NIO编程模型
即 handles 与 accept 等等,都是在同一个线程里面处理的
内核IO模型
以上是最基本的NIO,实际中并不会这样用。虽然也是非阻塞式IO但是不够高效
NIO 多路复用
即代码使用 :
selector.select();
这样 NIO就可以 监听多个IO,返回 多个数据。 实际编程就是使用这个模型
异步AIO
因为BIO和NIO都是同步的IO 。 而 AIO是异步的
网络web
静态资源
动态资源
tomcat结构
server组件
service 组件
connector 和 Processor组件
Engine组件
Host组件
context组件
wrapper 组件
参考 https://www.jianshu.com/p/76ff17bc6dea
来源:oschina
链接:https://my.oschina.net/ouminzy/blog/3162254