IO流与网络基础
1. Java中有几种类型的流?JDK为每种类型的流提供了哪些抽象类以供继承?
流的分类:
字节流(可处理任何数据,例如图片,声音等)
字符流(只能处理文本)
字节流继承于InputStream、OutputStream抽象类。
字符流继承于Reader、Writer抽象类。
2.字节流与字符流的区别?
字节流(可处理任何数据,例如图片,声音等,每次读写1个字节,默认没有缓冲)
字符流(只能处理文本,即只能读写2个字节的Unicode字符,默认带缓存)
3.什么是序列化,如何实现序列化?
序列化:用流将对象转成二进制写入硬盘或网络,ObjectOutputStream
反序列化:用流将二进制数据转为对象写入内存,ObjectInputStream
序列化的实现:
1. 首先,需要序列化的类要实现Serializable 接口,没有需要实现的方法,此接口只是为了标注对象可被序列化。
2. 然后使用一个输出流( 如:FileOutputStream ) 来构造一个ObjectOutputStream ( 对象流) 对象,再使用ObjectOutputStream 对象的
writeObject ( s1) 方法就可以将对象s1写出。
ObjectOutputStream oos= new ObjectOutputStream ( new FileOutputStream ( new File ( "D:/aaa.obj" ) ) ) ;
oos. writeObject ( s1) ;
4.什么是缓冲区?有什么作用?
缓冲区:在内存空间中预留了一定的存储空间,用来缓冲输入或输出的数据。
作用:缓冲区的作用就是为了解决速度不匹配的问题,高速的CPU与内存,内存与硬盘,CPU与IO等速度不匹配的问题。
5. BufferedReader属于哪种流,它主要是用来做什么的,它里面有哪些经典方法?
字符缓冲流;将读取的内容存在内存里面;最经典的方法是readLine(),一次读一行。
6.流如何关闭比较好,如果有多个流互相调用传入是怎么关闭的?
流一旦打开就必须关闭,可以使用close方法关闭,一般关闭流的操作放在finally语句块中以保证该操作一定会执行。
只关闭最外层的流即可。
7.为什么需要序列化?
1.为了方便数据存储
一般情况下Java对象的声明周期比Java虚拟机的短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,
这时候就需要把对象进行序列化之后保存。
2.为了方便数据的传递
把Java对象通过网络进行传输的时候,因为数据只能以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,
在接收端读到二进制数据之后反序列化成Java对象。
8.哪些属性不能被序列化?
Java中 static、transient 修饰的属性不能被序列化。
9.序列化ID作用?
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本的一致性。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID
与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。
10. transient关键字作用?
被transient修饰的变量不参与序列化和反序列化。
11. TCP和UDP区别?
连接 服务对象 可靠性 传输形式 传输效率 消耗资源 应用场景 TCP 有连接 一对一 可靠 字节流 慢 多 文件/邮件传输 UDP 无连接 一对一,一对多,多对一,多对多 不可靠 数据报 快 少 视频/音频传输
▪TCP协议:
▫ 使用TCP协议前,须先建立TCP连接,形成传输数据通道
▫ 传输前,采用“三次握手”方式,是可靠的。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达
▫ TCP协议进行通信的两个应用进程:客户端、服务端。每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)
▫ 在连接中可进行大量数据的传输,并且数据的传输是基于字节流的
▫ 传输完毕,需释放已建立的连接,效率低
▪UDP协议:
▫ 将数据、源、目的地封装成数据包,不需要建立连接
▫ 每个数据报的大小限制在64K内
▫ 因无需连接,故是不可靠的
▫ 发送数据结束时无需释放资源,速度快
12. TCP三次握手?
第一次握手:客户端向服务端发起建立连接请求 ,客户端会随机生成一个起始序列号 x,客户端向服务端发送的字段中包含标志位 SYN=1,序列号 seq=100。第一次握手前客户端的状态为 CLOSE,第一次握手后客户端的状态为 SYN-SENT。此时服务端的状态为 LISTEN 第二次握手:服务端在收到客户端发来的报文 后,会随机生成一个服务端的起始序列号 y,然后给客户端回复一段报文,其中包括标志位 SYN=1,ACK=1,序列号 seq=y,确认号 ack=x+1。第二次握手前服务端的状态为 LISTEN,第二次握手后服务端的状态为 SYN-RCVD,此时客户端的状态为 SYN-SENT。(其中 SYN=1 表示要和客户端建立一个连接,ACK=1 表示确认序号有效) 第三次握手:客户端收到服务端发来的报文 后,会再向服务端发送报文,其中包含标志位 ACK=1,序列号 seq=x+1,确认号 ack=y+1。第三次握手前客户端的状态为 SYN-SENT,第三次握手后客户端和服务端的状态都为 ESTABLISHED。
13. TCP四次挥手?
第一次挥手:客户端向服务端发送的数据完成后,向服务端发起释放连接报文 ,报文包含标志位 FIN=1,序列号 seq=u。此时客户端只能接收数据,不能向服务端发送数据。 第二次挥手:服务端收到客户端的释放连接报文后,向客户端发送确认报文 ,包含标志位 ACK=1,序列号 seq=V,确认号 ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。 第三次挥手:服务端发送完数据后向客户端发出连接释放报文 ,报文包含标志位 FIN=1,标志位 ACK=1,序列号 seq=w,确认号 ack=u+1。 第四次挥手:客户端收到服务端发送的释放连接请求,向服务端发送确认报文 ,包含标志位 ACK=1,序列号 seq=u+1,确认号 ack=w+1。
14. HTTP和HTTPS区别
HTTP HTTPS 端口 80 443 安全性 无加密,安全性差 有加密,安全性强 资源消耗 较少 较多 是否需要证书 不需要 需要 使用协议 TCP TCP、SSL、TLS
15.常见HTTP状态码
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
HTTP状态码的分类:
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
16.常见HTTP请求方法
方法 描述 1 GET 请求指定的页面信息,并返回实体主体。 2 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 3 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 4 DELETE 请求服务器删除指定的页面。
17.浏览器输入url地址到显示主页过程
1、用户在浏览器中输入url地址
2、浏览器解析域名得到服务器ip地址:浏览器会首先从缓存中找是否存在域名,如果存在就直接取出对应的ip地址,如果没有就开启一个DNS域名解析器。
DNS域名解析器会首先访问顶级域名服务器,将对应的ip发给客户端;然后访问根域名解析器,将对应的ip发给客户端;最后访问本地域名服务器,
得到最终的ip地址。
3、TCP三次握手建立客户端和服务器的连接:因为HTTP是基于TCP的可靠传输,所以在发送http数据报之前,需要先进行TCP的三次握手建立连接。
三次握手过程如下:
第一次握手:客户端--->服务端 ack=1,seq=x(x随机生成)
第二次握手:服务端--->客户端 ACK=1,ack=x+1,seq=y(y随机生成)
第三次握手:客户端--->服务端 ACK=1,ack=y+1,seq=x+1
完成第三次握手时,实际上客户端已经与服务器建立了连接,所以第三次握手的报文已经可以携带数据了。
4、客户端发送HTTP请求获取服务器端的静态资源
5、服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源
6、TCP四次挥手关闭客户端和服务器的连接:数据传输完毕后,TCP会进行四次挥手断开连接,释放资源。四次挥手过程如下:
第一次挥手:客户端--->服务器 FIN=1,ack=1,seq=u 客户端状态变为FIN_WAIT_1
第二次挥手:服务器--->客户端 ACK=1,ack=u+1,seq=v 服务器状态变为CLOSE_WAIT,TCP进入半关闭状态
第三次挥手:服务器--->客户端 FIN=1,ACK=1,ack=u+1,seq=w 服务器状态变为LAST_ACK
第四次挥手:客户端--->服务器 ACK=1,ack=w+1,seq=u+1 客户端状态变为TIME_WAIT,此时TCP未释放,需要等待计时器计时完成后,
客户端状态变为CLOSED
7、浏览器解析文档资源并渲染页面
浏览器解析文档资源并渲染页面流程:
(1)解析html资源,构建DOM Tree
(2)解析css资源,构建CSS Rule Tree
(3)JS通过DOM API和CSS OM API来操作DOM Tree和CSS Tree
(4)解析完成后综合DOM Tree和CSS Tree会生成Render Tree,计算每个元素的位置,这个过程就是回流(layout or reflow)
(5)调用操作系统Native GUI的绘制
(6)页面绘制完成
18. GET和POST区别
1. get 请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);post 请求一般是去提交数据。
2. get 因为参数会放在 url 中,所以隐私性,安全性较差,请求的数据长度是有限制的,不同的浏览器和服务器不同,一般限制在 2~8K 之间,
更加常见的是 1k 以内;post 请求是没有的长度限制,请求数据是放在 body 中;
4. get 请求刷新服务器或者回退没有影响,post 请求回退时会重新提交数据请求。
5. get 请求可以被缓存,post 请求不会被缓存。
6. get 请求会被保存在浏览器历史记录当中,post 不会。
19. AJAX原理
ajax:异步通信实现页面局部刷新的技术;
核心组件:XmlHttpRequest;
原理:通过XmlHttpRequest对象来向服务器发送异步请求,从服务器获得数据,然后用JavaScript来操作DOM而更新页面
实现 Ajax 异步交互需要服务器逻辑进⾏配合,需要完成以下步骤:
1. 创建 Ajax 的核⼼对象 XMLHttpRequest 对象
2. 通过 XMLHttpRequest 对象的 open() ⽅法与服务端建⽴连接
3. 构建请求所需的数据内容,并通过 XMLHttpRequest 对象的 send() ⽅法发送给服务器端
4. 通过 XMLHttpRequest 对象提供的 onreadystatechange 事件监听服务器端的通信状态
5. 接受并处理服务端向客户端响应的数据结果
6. 将处理结果更新到 HTML ⻚⾯中
20.七层模型
OSI模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
(1) 物理层
任务:透明地传输比特流。
功能:为数据段设备提供传送数据通路
传输单位:比特
所实现的硬件:集线器,中继器
(2) 数据链路层
任务:将网络层传输下来的IP数据报组装成帧
功能:a. 链路连接的建立、拆除和分离
b. 帧定界和帧同步
c.差错检测
传输单位:帧
所实现的硬件:交换机、网桥
协议:PPP,HDLC、SDLC、STP、ARQ
(3)网络层
任务:a. 将传输层传下来的报文段封装成分组
b.选择合适的路由,使得传输层传下来的分组能够交付到目的主机
功能:a. 为传输层提供服务
b. 组包和拆包
c. 路由选择
d.拥塞控制
传输单位:数据段
所实现的硬件:路由器
协议:ICMP、ARP、RARP、IP、IGMP、OSPF
(4)传输层
任务:负责主机中两个进程之间的通信
功能:a. 为端到端连接提供可靠的服务
b. 为端到端连接提供流量控制、差错控制、服务质量等管理服务
传输单位:报文段(TCP)或用户数据报(UDP)
协议:TCP、UDP
(5)会话层
任务:不同主机上各进程间的对话
功能:管理主机间的会话进程,包括建立、管理以及终止进程间的会话。是一种端到端的服务
(6)表示层
负责处理在两个内部数据表示结构不同的通信系统之间交换信息的表示格式,为数据加密和解密以及为提高传输效率提供必需的数据压缩以及解压等功能
(7)应用层
任务:提供系统与用户的接口
功能:a.文件传输
b. 访问和管理
c. 电子邮件服务
协议:FTP、SMTP、POP3、HTTP、DNS、TELnet