Java开发工程师最新面试题库系列——网络编程部分(附答案)
网络编程
-
什么是IO?
答:IO其实就是Input和Output的缩写,也就是输入输出操作。一般软件系统的 I/O 通常指磁盘和网络,Java中的IO是以流的形式对字节数据进行操作,输入流从Java程序中读取系统数据或网络传输数据到程序内存中,输出流是指将程序中的数据(内存数据)以流的形式向外部(系统,网络)输出传递出去。
-
常用的IO类有哪些?
答:FileInputStream,FileOutputStream,FileWriter,FileReader,ObjectOutputStream,ObjectInputStream,ByteArrayInputStream,ByteArrayOutputStream,InputStreamReader,OutputStreamWriter,BufferedReader,BufferedWriter
-
你在呢么理解IO、BIO、NIO、AIO?
答:IO输入输出流,BIO阻塞IO也就是传统IO,NIO是非阻塞IO,AIO是异步非阻塞IO
IO的对比
对比总结 BIO NIO AIO IO方式 同步阻塞 同步非阻塞 异步非阻塞 API使用难度 简单 复杂 复杂 可靠性 低 高 高 吞吐量 低 高 高 BIO
- 适用于连接较少,对服务器资源消耗很大,但是编程简单。是同步阻塞的。
- 举例:你到餐馆点餐,然后在那儿等着,什么也做不了,只要饭还没有好,就要必须等着
NIO
- 使用于连接数量比较多且连接时间比较短的架构,比如聊天服务器,编程比较复杂。是同步非阻塞的
- 举例:你到餐馆点完餐,然后就可以去玩儿了,玩一会儿就回饭馆问一声,饭好了没。
AIO
- 适用于连接数量多而且连接时间长的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。是异步非阻塞的。
- 举例:饭馆打电话给你说,我们知道你的位置,待会儿给您送来,你安心的玩儿就可以了。类似于外卖。
-
什么是比特、字节和字符?
答:
比特bit是计算机处理数据最基本的单位,一个bit由0或1表示。
8bit=1byte 8个比特等于1个字节。
一个字符是一个单位的字形、类字形单位或符号的基本信息,字符里面涉及到字符编码集,Java中的字符是Unicode编码,不同的字符编码集支持不同的字符符号,而且所占大小有所差别,通用的UTF-8编码集中英文占一个字节,汉字需要3-4个字节
-
Java有哪几种类型的流?
答:
-
按照流向划分:输出流和输入流
-
按照处理单位划分:字符流和字节流
-
按照功能划分:基础流和功能(包装)流
-
-
字节流和字符流有什么区别?
答:字节流式按照字节单位进行处理的流,字符流式在字节流基础上做的封装一般会根据字符编码集中字符的大小进行IO操作
-
Java的序列化是什么?
答:序列化就是将Java程序中的对象数据或内存中需要序列化的数据持久化到计算机磁盘上,将其转换为可传输可存储的二进制形式
-
怎么序列化一个对象?
答:序列化的方式很多,首先将需要序列化的类实现Serializable接口,常见的有JDK提供的ObjectOutPutStream或者JSON格式序列化等等
-
Java有哪两种方式实现序列化?
答:
- 将需要序列化的类实现Serializable接口,然后私有ObjectOutputStream将对象序列化
- 使用Externalizable,他是Serializable接口的子类,有时我们不希望序列化那么多,可以使用这个接口,这个接口的writeExternal()和readExternal()方法可以指定序列化哪些属性
-
怎么控制类中的变量不被序列化?
答:需要序列化的类要实现Serializable接口,这是必须的,然后将类中不需要序列化的属性加上transient修饰符
-
静态变量能不能被序列化?
答:不会
-
OSI的七层模型都有哪些?
答:物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
-
TCP和UDP协议有什么区别?
答:TCP是面向连接的的传输层协议,是一种安全、可靠、基于字节的传输协议。UDP是面向无连接的传输协议,不保证数据能被对方接收,容易导致数据丢失但传输效率高
TCP具有高可靠性,确保传输数据的正确性,UDP在传输数据前不建立连接,应用程序需要负责传输可靠性方面的所有工作
TCP对系统资源要求较多,UDP对系统资源要求较少
UDP具有较好的实时性,工作效率较TCP高
UDP的段结构比TCP的段结构简单,网络开销也小
-
TCP为什么要三次握手?
答:
原因一:防止重复连接
三次握手的主要原因是为了防止旧的重复连接引起连接混乱问题。
比如在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。
所以如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接。
原因二:同步初始化序列化
通过上面的概念我们知道 TCP 的一个重要特征就是可靠性,而 TCP 为了保证在不稳定的网络环境中构建一个稳定的数据连接,它就需要一个“序列号”字段来保证自己的稳定性,而这个序列号的作用就是防止数据包重复发送,以及有效的解决数据包接收时顺序颠倒的问题。
那么在建立 TCP 连接时就需要同步初始化一个序列号来保证 TCP 的稳定性,因此它需要执行以下过程:
●首先客户端发送一个携带了初始序列号的 SYN 报文给服务器端;
●服务端接收到消息之后会回复一个 ACK 的应答报文,表示客户端的 SYN 报文已被服务端成功接收了;
●而客户端收到消息之后也会发送一个 ACK 给服务端,服务器端拿到这个消息之后,我们就可以得到一个可靠的初始化序列号了。
而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了,所以 TCP 连接至少需要三次握手。
以上两种原因就是 TCP 连接为什么需要三次握手的主要原因,当然 TCP 连接还可以四次握手,甚至是五次握手,也能实现 TCP 连接的稳定性,但三次握手是最节省资源的连接方式,因此 TCP 连接应该为三次握手。