当前JavaEE初阶的阶段知识总结
-
多线程
-
文件IO
-
文件系统操作 ~~ File类.
-
文件内容操作 ~~ 读文件,写文件.
-
IO 流对象.
-
流(Stream),形象的比喻,读取文件,就像水流一样,读写文件的时候,和水流类似,读100字节,可以一次读1个字节,100次完成;也可以一次读10个字节,10次完成……
-
在Java标准库中,提供了一组类,负责完成IO流式操作.
-
字节流: 以字节为基本单位
- InputStream 输入流,把数据从硬盘,读取到内存中.
- OutputStream 输出流,把数据从内存写入到硬盘里.
-
字符流: 以字符为基本单位
- Reader 输入流
- Writer 输出流
-
上述这四个类,实际上,标准库还提供了很多具体的类的实现,虽然这里涉及到的类非常多,但是实际上大家的使用方法,都是差不多的.
四个核心操作:
-
打开文件 ~~ 构造流对象的时候,指定文件路径(绝对路径,相对路径)
-
读文件 ~~ read 参数是一个输出型参数
-
写文件 ~~ write
-
关闭文件 ~~ close
每次打开一个文件,都需要在进程对应内核PCB数据结构中, 申请一个文件描述符的表项,文件描述符表是有上限的.如果光打开,不关闭,此时就可能导致文件描述符被占满了,导致无法继续打开文件,所以一定关闭close文件.
-
-
-
-
-
网络编程&网络原理
-
协议
网络中的基本概念 ~~ 协议: 针对数据格式的约定.
- 协议分层
- 网络通信,是一个很复杂的工作,如果使用一个协议来完成所有的工作,这个协议就会很复杂. => 由此想到了,协议拆分,大的协议变成多个小点的协议,每个协议负责一部分工作.
- 由于拆分出来的协议太多了,按照协议的功能/作用,进行不同程度的分类 => 即协议分层,而为了让协议之间更好的配合,约定,上层协议调用下层协议,下层协议给上层协议提供服务.(协议之间不能跨层交互) => 就构成了一个**“协议栈**”
- “协议栈”: OSI 七层模型, TCP/IP 五层模型
- 应用层: 数据具体要怎么使用.
- 传输层: 只考虑起点和终点.
- 网络层: 负责任意两个节点之间的传输,路径传输.
- 数据链路层: 负责相邻节点之间的数据传输(通过网线/光纤/无线直接相连的两个路由器/交互机/主机….)
- 物理层: 信息传输的公路
- 网络数据传输的基本流程:
- 封装: 发送方,把数据从上到下层层加上协议报头(包装快递).
- 分用: 接受方,把数据从下层到上层进行解析(拆快递).
- 协议分层
-
网络编程
-
Socket (网络编程套接字) ~~ 注: UDP,TCP都是传输层协议.
TCP,有连接,可靠传输,面向字节流,全双工.
UDP,无连接,不可靠传输,面向数据报,全双工.-
UDP 的 socket
-
DatagramSocket , 代表一个 socket 对象,本质上一个文件,相当于网卡的抽象.
send 发送, receive 接受, close 关闭文件.
-
DatagramPacket , 代表一个 UDP 数据报.
构造对象,指定字节数组作为缓冲区.
-
-
TCP 的 socket
-
ServerSocket 专门给服务器用的.
提供的最核心方法 accept 用来接收一个连接.
-
Socket 服务器客户端都会用到.
客户端使用 Socket 和服务器建立连接,并且进行后续传输.
服务器使用 Socket 和客户端进行交互.
Socket 提供了getInputStream,getOutputStream获取到输入输出流,并进一步通过这些流对象来完成数据传输. -
编写TCP的客户端服务器程序的时候,涉及到“长连接”“短连接”的问题.
短连接: 传输一次就断开连接,后续传输,重新连接.
长连接: 一个连接中,多次数据传输.
注: UDP是无连接的,不涉及长连接,短连接的问题. -
TCP服务器如果不使用多线程,可能会无法处理多个客户端.
这个事情本质上是和代码结构有关系的,accept会阻塞,read也会阻塞…….这两个地方都可能阻塞,就导致一方阻塞之后,另一方即使数据传来了也无法处理(单线程),使用多线程就是为了规避多处阻塞的问题.
注: 对UDP来说,只有receive一处阻塞,不涉及这个问题.
-
-
服务器程序典型流程
- 启动服务器(初始化),进行 Socket 的实例化.
- 进入主循环(while true)
- 读取请求并解析
- 根据请求计算响应
- 把响应写回到客户端
-
客户端典型流程
- 启动客户端,进行 socket 实例化.
- 进入主循环.
- 读取用户输入的内容.
- 构造请求并发送.
- 读取响应结果.
- 把结果显示给用户.
-
-
-