IO(网络编程)
1、什么是 IO?
IO的定义:IO用于实现对数据的输入和输出操作
,流是从起源到接受的有序数据
2、常用的 IO 类有哪些?
1、字节流:FileInputStream、FileOutputStream
2、字符流: FileReader、FileWriter
2、字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter
3、转换流:InputStreamReader 字节流转字符输入 OutputStreamWriter 字节流转字符输出
4、标准输入输出流:System.in、System.out
5、打印流: PrintStream:字节打印流,PrintWriter:字符打印流
3、你怎么理解 IO、BIO、NIO、AIO?
IO: input/output
io即input/output, 即读写操作,io可以理解为bio,即blocking-io;
bio: 同步阻塞
bio(blocking-io)即同步阻塞,是Java传统io模型,一个线程触发io操作后必须等待这个io操作执行完成,
期间不能去做其他工作;
nio:同步非阻塞
nio(non-blocking-io) 即同步非阻塞io,一个线程触发io操作后它可以立即返回,
但是它需要不断地轮询去获取执行结果
aio: 异步非阻塞
aio(Asynchronous-io) 是异步非阻塞io,一个线程触发io操作后它可以立即返回去做其他工作,
内核系统将io操作执行完成后会通知该线程。
4、什么是比特(Bit)、字节(Byte)、字符(Char)?
Bit最小的二进制单位 ,是计算机的操作部分取值0或者1。
Byte是计算机中存储数据的单元,是一个8位的二进制数,(计算机内部,一个字节可表示一个英文字母,两个字节可表示一个汉字。) 取值(-128-127)
Char是用户的可读写的最小单位,他只是抽象意义上的一个符号。如‘5’,‘中’,‘¥’等等。在java里面由16位bit组成Char 取值(0-65535)
Bit 是最小单位 计算机他只能认识0或者1
Byte是8个字节 是给计算机看的
字符 是看到的东西 一个字符=二个字节
5、Java 有哪几种类型的流?
一、字节流 InputStream/OutputStream
1、FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作
2、BufferedInputStream/BufferedFileOutputStream:加缓冲区的字节流,用于提高效率
二、字符流 Reader/Writer
1、FileReader/FileWriter:文件字符流,用于文本文件的读写操作
2、BufferedReader/BufferedWriter:加缓冲区的字符流,用于提高效率
三、转换流 InputStreamReader/OutputStreamWriter
6、字节流和字符流的区别?
1、定义
字节流是一种执行8位字节输入和输出的机制,基本单元为字节;
而字符流是Java中执行16位Unicode输入和输出操作的机制,基本单元为Unicode码元。
2、结尾
字节流以stream结尾;而字符流以reader和writer结尾
3、处理方式
字节流是最基本的,采用ASCII编码;它通常用于处理二进制数据,它是按字节来处理的,
实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元。
字符流采用Unicode编码,它是按虚拟机的encode来处理,也就是要进行字符集的转化;
它通常处理文本数据,它支持写入及读取Unicode码元。
4、缓冲区
字节流默认不使用缓冲区;字符流使用缓冲区。
7、Java 序列化是什么?
java的序列化是将Java对象转换成字节流
的过程。当Java对象需要在网络上传输
或者 持久化存储到文件中
时,
就需要对 Java 对象进行序列化处理。
8、怎么序列化一个对象?
类实现 Serializable 接口
9、Java 有哪两种序列化方式?
相应的对象实现了序列化接口java.io.Serializable(隐式序列化), 自动序列化所有非static和 transient关键字修饰的成员变量.
相应的对象实现Externalizable接口(显式序列化)。Externalizable 继承了 Serializable,并且增加了两个自定义方法。
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
10、怎么控制类中的某些变量不被序列化?
Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,
可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
11、静态变量能不能被序列化?
静态成员属于类级别的,所以不能序列化,这里的不能序列化的意思,是序列化信息中不包含这个静态成员域
12、OSI 的七层模型都有哪些?
13、tcp 和 udp 协议的区别?
14、tcp 为什么要三次握手,两次不行吗?
TCP 的三次握手是为了保证数据的可靠传输的
,TCP 是全双工的协议
,也就是说通过 TCP 协议发送的协议是要得到回复的
,一来一回,所以说对于需要建立 TCP 连接的两端来说,每一端都需要进行一来一回的确认,这就进行三次握手。
1、A 给 B 发送需要建立连接的请求;
2、B 给 A 发送可以建立连接的回复;
3、A 给 B 发送确认收到回复的信息;
如果只进行二次握手:
1、A 给 B 发送需要建立连接的请求;
2、B 给 A 发送可以建立连接的回复;
这样看似没有什么问题,但是这样还是不行的,因为第二次握手的时候 B
不知道自己发送给 A 的应答包是否可以到达 A;B 只知道了 A 能发,
并不知道 A 是否能收;所以这样的连接还是不可靠的。
如果进行四次握手:
1、A 给 B 发送需要建立连接的请求;
2、B 给 A 发送可以建立连接的回复;
3、A 给 B 发送确认收到回复的信息;
4、B 给 A 发送确认收到确认的信息;
当进行到第二步的时候 B 在等待 A 的确认信息,只有等到这个消息,B 才能确认建立连接,
这样其实就够了,如果需要进行第四次确认也可以,进行 40 次握手也可以,400 次也可以,
但是握手次数的增多并不能保证通信达到稳定。所以只需要达到了一个最基本的可以建立连接的条件(三次握手)就可以了,
多次反而会浪费资源,三次握手是保证双方互相明确对端可以收发的最低值。
15 TCP的三次握⼿和四次挥⼿
TCP协议是7层⽹络协议中的传输层协议,负责数据的可靠传输。在建⽴TCP连接时,需要通过三次握⼿来建⽴,过程是:
1.客户端向服务端发送⼀个SYN
2.服务端接收到SYN后,给客户端发送⼀个SYN_ACK
3.客户端接收到SYN_ACK后,再给服务端发送⼀个ACK
在断开TCP连接时,需要通过四次挥⼿来断开,过程是:
1.客户端向服务端发送FIN
2.服务端接收FIN后,向客户端发送ACK,表示我接收到了断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还有数据正在处理
3.服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
4.客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了