
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
第4章 非阻塞通信
对于用ServerSocket以及Socket编写的服务器程序和客户程序,它们在运行过程中常常会阻塞。例如当一个线程执行ServerSocket的accept()方法时,假如没有客户连接,该线程就会一直等到有了客户连接才从accept()方法返回。再例如当线程执行Socket的输入流的read()方法时,如果输入流中没有数据,该线程就会一直等到读入了足够的数据才从read()方法返回。
假如服务器程序需要同时与多个客户通信,就必须分配多个工作线程,让它们分别负责与某个客户通信,当然每个工作线程都有可能经常处于长时间的阻塞状态。
从JDK1.4版本开始,引入了非阻塞的通信机制。服务器程序接收客户连接、客户程序请求建立与服务器的连接,以及服务器程序和客户程序收发数据的操作都可以按非阻塞的方式进行。服务器程序只需要创建一个线程,就能完成同时与多个客户通信的任务。
非阻塞的通信机制主要由java.nio包(新I/O包)中的类实现,主要的类包括ServerSocketChannel、SocketChannel、Selector、SelectionKey和ByteBuffer等。
本章介绍如何用java.nio包中的类来创建服务器程序和客户程序,并且分别采用阻塞模式和非阻塞模式来实现它们。通过比较不同的实现方式,可以帮助读者理解它们的区别和适用范围。