本帖最后由 王磊 于 2013-7-24 21:13 编辑
通过打印语句的逐行验证的结果,有一些个人的理解。
Ctrl+C,是系统底层的一个关键字,通过键入它,可以结束当前运行的线程,并提供给当前线程一个null指令,这个null指令只能被本地线程(客户端识别),因为通过验证发现当键入Ctrl+C的时候,服务端接收到的是一个值为"null"的字符串,这样在服务端看这个字符串就不具备与客户端识别的一样的功能。服务端对于这个"null"只会当做字符串去处理。
而且通过验证发现,在客户端执行Ctrl+C的时候,服务端线程并不是马上停止,而是会继续执行以下几行代码,我也不知道这是什么原因,目前还在查相关资料。。。
所以这就可以解释为什么要在客户端执行一次判断line==null,因为判断它,是为了让客户端识别Ctrl+C发出的可识别指令,但是执行后会继续执行后续一些代码,这样就会执行到关流和关服务端的方法close(),这个方法才会给服务端发送一个服务端可识别的null指令。
而如果不加这条判断语句,虽然客户端资源也被关闭,但却不是通过关资源的方法关闭的,这样服务端没有得到确切的客户端关闭的指令,这样的话服务端还有阻塞式方法在等待执行,并且又同时与客户端没有了连接,这样服务端就会报出异常。
本人验证的时候忘记截图,而且要截的也实在太多了,楼主可以自己先试下去验证。应该会有一定的理解的。
说的有点乱,希望能够有所帮助。 |