Netty权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人


2.1.2 同步阻塞式I/O创建的TimeServer源码分析

备注:以下代码行号均对应源代码中实际行号。)

代码清单2-1 同步阻塞I/O的TimeServer

TimeServer根据传入的参数设置监听端口,如果没有入参,使用默认值8080,29行通过构造函数创建ServerSocket,如果端口合法且没有被占用,服务端监听成功。32~35行通过一个无限循环来监听客户端的连接,如果没有客户端接入,则主线程阻塞在ServerSocket的accept操作上。启动TimeServer,通过JvisualVM打印线程堆栈,我们可以发现主程序确实阻塞在accept操作上,如图2-2所示。

图2-2 主程序线程堆栈

当有新的客户端接入的时候,执行代码34行,以Socket为参数构造TimeServerHandler对象,TimeServerHandler是一个Runnable,使用它为构造函数的参数创建一个新的客户端线程处理这条Socket链路。下面我们继续分析TimeServerHandler的代码。

代码清单2-2 同步阻塞I/O的TimeServerHandler

37行通过BufferedReader读取一行,如果已经读到了输入流的尾部,则返回值为null,退出循环。如果读到了非空值,则对内容进行判断,如果请求消息为查询时间的指令"QUERY TIME ORDER"则获取当前最新的系统时间,通过PrintWriter的println函数发送给客户端,最后退出循环。代码47~64行释放输入流、输出流、和Socket套接字句柄资源,最后线程自动销毁并被虚拟机回收。

在下一个小结,我们将介绍同步阻塞I/O的客户端代码,然后分别运行服务端和客户端,查看下程序的运行结果。