![Netty权威指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/711/47378711/b_47378711.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.1.2 同步阻塞式I/O创建的TimeServer源码分析
(备注:以下代码行号均对应源代码中实际行号。)
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/30_1.jpg?sign=1739253735-UAo6L625g2NXt4Ae7UKcp10WGMzV9J1I-0-5c04bf0200c5a988f0abd93fb029a026)
代码清单2-1 同步阻塞I/O的TimeServer
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/31_1.jpg?sign=1739253735-GXS9HQZs2pfY73Yr1OhvjQuZoos7CsJT-0-eab31b35968f90b188c11a17489ac976)
TimeServer根据传入的参数设置监听端口,如果没有入参,使用默认值8080,29行通过构造函数创建ServerSocket,如果端口合法且没有被占用,服务端监听成功。32~35行通过一个无限循环来监听客户端的连接,如果没有客户端接入,则主线程阻塞在ServerSocket的accept操作上。启动TimeServer,通过JvisualVM打印线程堆栈,我们可以发现主程序确实阻塞在accept操作上,如图2-2所示。
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/31_2.jpg?sign=1739253735-OwJpSy9vaQ2Rq5114q8eLs5WIAR043un-0-f35d0ff8dd736b0bb9a3d44426de36dc)
图2-2 主程序线程堆栈
当有新的客户端接入的时候,执行代码34行,以Socket为参数构造TimeServerHandler对象,TimeServerHandler是一个Runnable,使用它为构造函数的参数创建一个新的客户端线程处理这条Socket链路。下面我们继续分析TimeServerHandler的代码。
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/31_3.jpg?sign=1739253735-LwXleAUJJpSfDcTkSPVWHuhAabQEMyuh-0-4da127fa1a590281d3ae444fa24fe5b1)
代码清单2-2 同步阻塞I/O的TimeServerHandler
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/32_1.jpg?sign=1739253735-yL63H8GXl6fB8uLwWqMucdFA0OPGaBRc-0-b70c4da485e0271d18ae46f9311f58b5)
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/33_1.jpg?sign=1739253735-JBnTAYtEqFc9jsqBxKkXkrZpnlqf6vIP-0-3568793ca902c2b68d5062f52584a7ae)
37行通过BufferedReader读取一行,如果已经读到了输入流的尾部,则返回值为null,退出循环。如果读到了非空值,则对内容进行判断,如果请求消息为查询时间的指令"QUERY TIME ORDER"则获取当前最新的系统时间,通过PrintWriter的println函数发送给客户端,最后退出循环。代码47~64行释放输入流、输出流、和Socket套接字句柄资源,最后线程自动销毁并被虚拟机回收。
在下一个小结,我们将介绍同步阻塞I/O的客户端代码,然后分别运行服务端和客户端,查看下程序的运行结果。