最近在面试 有些概念懂 可是须要梳理一下 借着面试看看本身会多少.java
1.网络编程的同步 异步 阻塞 非阻塞?面试
同步:函数调用在没有获得结果以前,不返回任何结果;数据库
异步:函数调用在没有获得结果以前,不返回任何结果,返回状态值;编程
阻塞:函数调用在没有获得结果以前,线程挂起,获得结果以后返回值。缓存
非阻塞:函数调用在没有获得结果以前,当前线程不会挂起,当即返回结果。服务器
2.Java如何实现无阻塞方式的Socket编程?网络
NIO能够有效解决多线程服务器存在的线程开销问题,NIO的多线程不是为了应对客户端请求而独立分配线程,多线程
而是经过多线程充分利用CPU的处理能力和处理的时间,达到提升服务效果。异步
3.什么是Java序列化函数
为了保存内存中各类对象的状态(也就是实例变量,而不是方法),而且能够把对象能够读取出来,虽然能够经过方法保存对象状态,java提供了对象
序列化机制更好的保存对象状态(具体的对象序列化能够参照Hibernate二级缓存)
4.什么状况下须要序列化?序列化须要注意什么事情,如何实现Java序列化(串行化)?
Java对象序列化到文件或者数据库中;
使用套接字在网络上传输对象时须要进行序列化;
当但愿RMI传输对象的时候;
序列化注意事情:
1).若是子类实现了序列化接口Sericalizable而父类未实现,父类必须提供一个无参构造函数,不然会抛出InvalidClassException异常。
2).类的静态变量不会被序列化,由于这个静态变量是类变量,而不是对象的。串行化保存的是是对象属性,即非静态的变量。
3.)Java序列化是为了节约磁盘空间,具备特定规则。
4).序列化到同一文件,若是修改了相同对象的属性再次保存时,所以只保存第二次的引用,读取第一次的存储。
5.Java有那几种流?JDK提供哪些接口能够继承?
Java提供的流对象
InputStram 字节输入流 OutputStream 字节输出流 Reader 字符输入流 Writer 字符输出流
按流向划分:
输出: 输出字节流 OutputStraam 输出字符流 Writer
输入: 输入字节流InputStream 输入字符流 Reder
按照传输单位划分:
字节流:8位 一个比特 通常状况下图片 等是二进制文件
字节流:16位 两个比特
6.用Java Socket编程
比较典型的Java Socket编程,发送请求后,等待服务器响应。 (这个过程存在阻塞方法)
大概过程
1.建立一个Socket实例,构造函数先远处服务器域名和端口 简历TCP链接
2.经过IO流与服务器创建链接(这个地方存在阻塞方法)
3.IO流中读取数据 而且 Socket关闭链接;
服务器的构建模型
1.建立一个ServerSocket端口监听,设置监听端口,用于获取TCP链接
2.重复执行(whlie(true))监听状态一直持续
3.调用ServerSocket 的accept()方法,返回一个客户端链接实例
4.为返回的Socket建立一个新的线程,用于进行线程的服务。
5.通信完成,关闭Socket的close()
7.TCP有链接时候有三次握手?断开链接有几回握手?
客户端 服务器
| (发送请求 i) |
| ---------------> (i) |(建立j,而且i+1)
| <---------------(j,i+1) |
| (获取 j,i+1) 而且(j+1,i+) |
| -------------->(j+1,i+1) |(获取j+1,i+1) 完成握手
seq 是包自己的序列号 ack是确认链接
一次释放 断开链接请求 确认断开链接