
4.7 小结
本章介绍了用ServerSocketChannel与SocketChannel来创建服务器和客户程序的方法。ServerSocketChannel与SocketChannel既可以工作于阻塞模式,也可以工作于非阻塞模式,在默认情况下,它们都工作于阻塞模式,可以调用configureBlocking()方法来重新设置模式。
AsynchronousSocketChannel类和AsynchronousServerSocketChannel类表示异步通道。AsynchronousSocketChannel类的请求建立连接方法和读写方法,以及AsynchronousServerSocketChannel类的接受连接方法总是采用非阻塞工作模式,并且它们的非阻塞方法会立即返回一个Future对象,用来存放方法的执行结果。
第1章、第3章以及本章对EchoServer共提供了6种实现方案,见表4-1。
表4-1 EchoServer的6种实现方案

总的说来,尽管阻塞模式与非阻塞模式都可以同时处理多个客户连接,但阻塞模式需要使用较多的线程,而非阻塞模式只需使用较少的线程,非阻塞模式能更有效地利用CPU,系统开销小,因此有更高的并发性能。
阻塞模式编程相对简单,但是当线程数目很多时,必须处理好线程之间的同步,如果自己编写线程池,要实现健壮的线程池难度就较高。阻塞模式比较适用于同步通信,并且通信双方稳定地发送小批量的数据,双方都不需要花很长时间等待对方的回应。假如在通信过程中,由于一方迟迟没有回应,导致另一方长时间地阻塞,为了避免线程无限期地阻塞下去,应该设置超时时间,及时中断长时间阻塞的线程。
非阻塞模式编程相对难一些,对ByteBuffer缓冲区的处理比较麻烦。非阻塞模式比较适用于异步通信,并且通信双方发送大批量的数据,尽管一方接收到另一方的数据可能要花一段时间,但在这段时间内,接收方不必傻傻地等待,可以处理其他事情。