我有一个用Netty实现的HTTP服务器。它需要长轮询连接才能将消息推送到浏览器。在大多数情况下,服务器不会尝试关闭连接。
在TCP会话中,如果任何一方想要关闭连接,它会向另一方发送FIN数据包。如果服务器没有从客户端接收FIN,例如1)用户有硬网络故障或2)有人试图攻击服务器,是否保证Netty服务器将收到超时(如果服务器没有从客户端接收FIN,该怎么办?或者在给定时间后的其他类型的例外?
如果这是真的,我不需要在我的通道管道中添加一个Read / WriteTimeoutHandler,当Timer触发超时时,它会关闭通道。我必须以任何一种方式关闭通道,否则我会泄漏资源。
答案 0 :(得分:2)
是否保证Netty服务器在给定时间后会收到超时(或其他类型)异常?
没有。如果套接字处于阻塞模式并且已设置读取超时,则会引发SocketTimeoutException
。如果已启用TCP keepalive并且连接确实在2小时内保持断开,则可能会发生IOException: connection reset
:这不包括对等方仅仅保持连接保持运行的情况。否则没有。
答案 1 :(得分:0)
根据TCP状态图,应发送双方FIN以关闭两侧的连接。但是,如果FIN在您的情况下丢失,则TCP将通过适当的超时值来克服。