1.实现原理:阻塞式通信模型是因为服务器端在accept和read方法的时候,如果没有外部网络连接请求或者外部网络的数据传输,那么就会处于等待状态。非阻塞式通信模型,主要是通过为accept和read方法设置等待时间,在超过等待时间之后可以让CPU暂时做一些其他处理,过一段时间再去监测accept方法和read方法。
2.服务端代码:
(1)为accept方法设置等待时间:
(2)为read方法设置等待时间:
3.客户端代码:
4.实验结果:
(1)为accept方法设置等待时间:
先启动服务端(不启动客户端),此时没有客户端连接请求。服务器等待3秒,若没有客户端请求过来,则服务器可以在这个时候让CPU去做其他处理。运行结果如下图:
此时启动客户端,服务器收到客户端请求,处理客户端请求,并将处理结果返回给客户端。
服务器端运行结果如下图:
客户端运行结果如下图:
注:因为编码的不同,所以客户端发送的消息到了服务端可能会乱码。比如我在客户端输入的是“nihao。”,到服务端就成了“ihao。”。如果输入的是汉字的话就可以明显的看出来。所以在测试之前还需要调整编码,我这里就不调了。
(2)为read方法设置等待时间:
先启动服务端(不启动客户端),此时因为没有连接请求,所以accept方法在监测超时后CPU会进行一段时间的其他处理。
启动客户端,此时客户端发送连接请求,服务端收到连接请求以后,read方法开始监测数据传输,因为客户端没有发送任何数据,所以在read方法监测超时以后CPU也会进行一段时间的其他处理。
此时客户端发送数据,服务端read方法接收到数据,CPU先去处理read接收到的数据,处理完以后如果客户端不发送数据,那么read方法在等待超时之后,CPU会继续先进行一段时间的其他处理。
注:(1)可以看到因为没有设置编码的问题,确实是乱码的。(2)因为本例是单线程的,所以在有客户端连接以后,进入read方法,那么accept方法就不会再执行,也就不会再阻塞,所以不会再有“accept方法CPU执行其他操作“。
5.总结:(1)阻塞型通信模型到非阻塞型通信模型的转变,就是为accept和read方法设置等待时间。