4.2.3 限制每个客户端的时间

现在假设要实现一个为每个客户端限定了服务时间的回显协议。也就是说我们定义一个了目标,TIMELIMIT,并在协议中实现经过TIMELIMIT毫秒后,实例就自动终止。协议实例保持了对剩余服务时间的跟踪,并使用setSoTimeout()方法来保证read()方法的阻塞时间不会超过TIMELIMIT。由于没有办法限制write()调用的时间,我们并不能保证所定义的时间限制真正有效。尽管如此,TimelimitEchoProtocol.java还是实现了这种方法;要与TCPEchoServerExecutor.java一起使用,只需要简单地将while循环的第二行改为:

service. execute(new TimeLimitEchoProtocol(clntSock,logger));

第5章将介绍更强大的机制(在所有I/O调用上,包括写操作)来限制线程阻塞时间,这些机制都使用NIO包的工具类实现。

TimeLimitEchoProtocol.java

figure_0101_0119

figure_0102_0120

figure_0102_0121

TimelimitEchoProtocol类与EchoProtocol类非常相似,唯一的区别在于它试图将回显连接的总服务时间限制在10秒钟之内。当handleEchoClient()方法被调用时,就通过当前时间和服务期限计算出了服务的截止时间。每次read()调用结束后将重新计算当前时间与截止时间的差值,即剩余服务时间,并将套接字超时设置为该剩余时间。