我们在前面已经实现了通过自定义协议采集客户端发出的数据。但是在实际项目的运行中,硬件并不是时时刻刻都在发送数据,而是会按照设定的时间间隔,有规律地传输。或者有些硬件终端因为故障、电源耗尽而无法继续发送数据。如果出现这样的情况,那服务端是不是就要一直保持长连接呢?打个不恰当的比方,是不是有十万名游客来到故宫旅游,就要给故宫装十万个马桶呢?
这样做纯属浪费资源,而且也不可能实现。这放到客户端与服务端的通信机制上也是一样的——虽然有成千上万个硬件设备会与服务端通信,但是在某个时刻,只有固定数量的硬件才会给服务端发数据,而其它的都在「休眠」。
这就给工程师提了一个要求:服务端必须知道每一个与之通信的客户端,并且在客户端长久没连接的情况下主动关闭服务。
为什么是服务端来做这件事?——游客离开故宫难道还要给故宫打招呼吗?——这么想就能想通。
对于这个问题,作为一个优秀的通信框架,Netty怎么会忽略呢?当连接的空闲时间(读或者写)太长时,Netty将会触发一个IdleStateEvent事件,然后工程师可以通过覆写ChannelHandlerAdapter的userEventTriggered()方法来实现自己想要实现的功能。
所以,咱们可以先继承ChannelHandlerAdapter,然后覆写userEventTriggered()方法: