4.4 控制默认行为
TCP/IP协议的开发者用了大量的时间来考虑协议的默认行为,以满足大部分应用程序的需要。(如果你对此表示怀疑,可以参考RFC1122和1123,它们根据多年的经验对TCP/IP协议的实现的推荐行为进行了详尽的描述。)对于大多数应用程序来说,这些设计都非常适合,然而,“满足所有需求的一种尺寸”能够真正适用于所有场合的情况非常少。前面我们已经看到UDP回显客户端的例子。默认情况下,DatagramSocket类的receive()方法将无限期地阻塞等待一个数据报文,在我们的例子中,通过在UDP套接字上指定了一个接收超时时间并在TimeLimitEchoProtocol类中使用了setSoTimeout()进行设置,从而改变了协议的默认行为。
4.4.1 Keep-Alive
如果一段时间内没有数据交换,通信的每个终端可能都会怀疑对方是否还处于活跃状态。TCP协议提供了一种keep-alive的机制,该机制在经过一段不活动时间后,将向另一个终端发送一个探测消息。如果另一个终端还处于活跃状态,它将回复一个确认消息。如果经过几次尝试后依然没有收到另一终端的确认消息,则终止发送探测信息,关闭套接字,并在下一次尝试I/O操作时抛出一个异常。注意,应用程序只要在探测信息失败时才能察觉到keep-alive机制的工作。
Socket:保持活跃
默认情况下,keep-alive机制是关闭的。通过调用setKeepAlive()方法将其设置为true来开启keep-alive机制。