为什么要理解这几个名词?
想要真正理解网络编程的原理,下面几个名词的理解是不可避免的,如果对下面几个名词不清晰,去学习网络编程中的BIO、NIO、AIO框架,会越陷越深,无法自拔。
同步、异步、阻塞、非阻塞
同步与异步:同步和异步是客户端与服务端通信的一种机制。
同步通信:就是客户端发送请求后,必须要等着接收到服务端的响应才能进行下一个请求。
异步通信:就是客户端发送请求后,不必一直等待服务端的响应,它仍然可以进行下一个请求,最终结果可能会由服务端通过回调函数返还给客户端。
阻塞和非阻塞:阻塞和非阻塞是客户端线程在等待服务端响应过程中的一个线程状态。如果在等待的过程中线程可以继续运行则叫做非阻塞,但是如果等待的过程中线程挂起或者休眠了就叫做阻塞。
场景:小明用下载器下载一部电影,分析这个过程。
1、同步阻塞
场景:小明(客户端),下载器(服务端),下载电影(客户端请求),下载完成(服务端响应),下载器有无完成时提醒(服务端回调函数)
小明使用下载器下载电影,一直等在电脑前面,什么事情没有做,等待电影下载完成。
同步:小明一直等待电影下载完成=客户端一直在等待服务端响应。
阻塞:等待的过程,小明啥事也没做,空等。
2、同步非阻塞
场景:小明(客户端),下载器(服务端),下载电影(客户端请求),下载完成(服务端响应),下载器有无完成时提醒(服务端回调函数)
小明使用下载器下载电影,跑去看电视,时不时看下下载进度,电影下载完成。
同步:就下载电影这件事,小明一直等待电影下载完成=客户端一直在等待服务端响应。
非阻塞:小明在下载电影的过程中,还去看电视了。
3、异步阻塞
场景:小明(客户端),下载器(服务端),下载电影(客户端请求),下载完成(服务端响应),下载器有无完成时提醒(服务端回调函数)
小明使用下载器下载电影,一直等待在电脑前面,啥事也不做,下载完成后下载器有提醒。
异步:小明下载电影1后其实可以立马下载其他电影,不用等电影1下载完。但是因为阻塞了,所以没有得到体现。
阻塞:小明还是一直等待在电脑前面。空等。
4、异步非阻塞
场景:小明(客户端),下载器(服务端),下载电影(客户端请求),下载完成(服务端响应),下载器有无完成时提醒(服务端回调函数)
小明使用下载器下载电影1,过了一分钟(电影1没下载完),小明又开始下载电影2,然后再去看电视,下载器下载完成提醒小明。
异步:小明用下载器下载电影1,不用等电影1完成,又下载电影2。客户端请求服务端,不用等它响应,又请求客户端。
非阻塞:小明在下载电影的过程中,还去看电视了。