面试记录第二十三节——(java网络编程、BIO/NIO/AI0)

移动开发 waitig 370℃ 百度已收录 0评论

一、基础知识:

1、基础知识

a) :

ip:它是识别网络通讯的实体,可以理解为主机,也可以理解为每个路由器的端口。

端口号:一个通讯实体他可以拥有很多的通讯程序同事提供网络服务,这个时候就要通过端口号来区分通讯程序,一个通讯实体不能有两个通讯程序使用同一个端口号。

b):

tcp/udp协议:

tcp:它是一个面向链接的保证可靠传输的协议,通过tcp协议传输,得到的是一个顺序的无差错的数据流,他能提供两台计算机之间的可靠数据传输。

udp协议:他是一个无链接的协议,每个数据包都是一个独立的信息,包括原地址和目的地址,他在网络上可以通过任何的途径把信息传递到目的地。至于能否达到目的地、达到目的地的时间、信息的准确性都不能得到保证。

c) :

URL:统一的资源定位器,他指向的是我们互联网中的一些资源,主要是从输入流中读取数据,再通过输出流写入文件,执行的结果就是我们输入的浏览器地址的服务器返回的内容。

d):

InetAddress:这是java提供的一个代码IP地址的类,了解下即可,


二、问:既然有了可靠的TCP协议,那为什么还留着不可靠的UDP协议呢。

答:有两个原因,第一个是因为可靠的协议肯定需要付出代价,例如对数据的时间和检验必然会消耗计算机的计算时间和网络贷款,因此TCP的传输效率远远不如UDP高。第二是因为不是所有的程序都需要保证数据传递的可靠性,例如视频聊天,音频,只要保证数据连贯性即可,不开率数据是否安全。所以这些场景下用UDP更合适,


三、问:socket

答:socket:他没有一个具体的实体,他只是描述计算机之间完成通讯的一种抽象功能,你可以理解为交通工具,有了这个交通工具,你就可以在各个城市之间穿梭。

  • 客户端链接
    这里写图片描述

这里写图片描述

  • 服务端链接
    这里写图片描述

这里写图片描述

  • 总结:
    这里写图片描述

四、Java对BIO、NIO、AIO的支持?

答:

Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

注意:个人认为,IO的核心功能要吗是数据格式影响IO操作方式,要吗是传输方式影响IO才做,也就是将什么数据写入到什么地方的问题,IO只是人与机器、机器与机器之间的交互手段,除了在他们能够完成这交互功能之外,我们更多的是关注如何提高它的运行效率,而数据和传输方式是影响效率最关键的两个元素。


五、阻塞IO通讯模型?

答:阻塞式IO其实我们我们常说的IO流处理。当我们调用ServerSocket.accept()方法之后也会一直阻塞,知道有客户端链接请求时候才会返回,每个客户端连接之后,服务端都会启动一个线程去处理客户端的请求。这就是阻塞IO的通讯模型。

当然阻塞IO通讯模型也有不好的地方
1):当客户端很多的时候,服务端会创建大量的线程,而这些线程都需要消耗资源。
2):阻塞可能带来频繁的上下文切换,而其中大部分的上下文切换可能是无意义的,这样就加重了CPU的负担。

总结:不管是磁盘IO还是网络IO,数据在写入Outputstream或者从InputStream读取时都有可能阻塞,一旦有线程出现阻塞,此线程就是去了调用cpu的使用权,这种情况在大规模的访问或者有性能要求的情况下是不能被允许的,虽然现在我们IO有些解决办法,比如一个客户端处理一个线程,出现阻塞时只有他自己一个线程阻塞,不会妨碍其他线程的工作。还有比如为了减少系统cpu的开销采用线程池的办法来减少线程的创建和回收的成本,但是还是存在某些场景是无法解决的。(比如我们现在需要大量的HTTP长连接的情况,例如淘宝、购票软件等,它服务端要保证几百万的http链接,但是并不是每时每刻这些链接都在传输数据,这种情况下你不可能创建几百万的线程保持连接),所需这里我们就需要寻求另一种更好的IO流(NIO)


六、NIO()

答:同步非阻塞式IO,关键是采用了事件驱动的思想来实现了一个多路转换器。

a、工作原理

同步非阻塞式IO,关键是采用了事件驱动的思想来实现了一个多路转换器。

b、通讯模型

同步非阻塞式IO,关键是采用了事件驱动的思想来实现了一个多路转换器。
NIO与BIO最大的区别就是只需要开启一个线程就可以处理来自多个客户端的IO事件,这是怎么做到的呢?
就是多路复用器,可以监听来自多个客户端的IO事件:

A. 若服务端监听到客户端连接请求,便为其建立通信套接字(java中就是通道),然后返回继续监听,若同时有多个客户端连接请求到来也可以全部收到,依次为它们都建立通信套接字。

B. 若服务端监听到来自已经创建了通信套接字的客户端发送来的数据,就会调用对应接口处理接收到的数据,若同时有多个客户端发来数据也可以依次进行处理。

C. 监听多个客户端的连接请求和接收数据请求同时还能监听自己时候有数据要发送。


本文由【waitig】发表在等英博客
本文固定链接:面试记录第二十三节——(java网络编程、BIO/NIO/AI0)
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)