java中的套接字不活动超时

时间:2009-09-30 14:21:10

标签: java sockets timeout

我无法在套接字java API中找到关闭非活动连接的方法,打开TIMEOUT毫秒。 当我忘记明确关闭套接字(并强制重新启动远程资源)时,目标是避免出现令人尴尬的错误。

如果我找不到低级方法,我会在连接中添加最后一次使用的值,并定期检查...但我觉得很难看。

谢谢,

安托

P.S。我不希望连接超时,我不确定理解setSoTimeout,但我很确定这不是我们想要的。

P.P.S。当然,避免忘记关闭更好,但在一个大项目+大团队......我们试图找到一种100%安全的方式。

2 个答案:

答案 0 :(得分:2)

尝试启用SO_KEEPALIVE:

s.setKeepAlive(true);

使用keep alive设置,客户端应偶尔(通常一两个小时)将测试数据包发送回服务器。如果它在几分钟内没有收到响应,它将假定服务器已关闭连接而没有通知它并将自行关闭。

这应该适用于您的服务器无论如何崩溃的情况。如果您的服务器仍在运行,我不确定它是否会起作用 - 只是忽略了客户端。

跟踪您创建的所有套接字并让线程定期检查每个套接字以查看它是否仍处于打开状态并且最近已被使用,这将远远好得多。我不认为这很难看,我认为这可能是解决这个问题的最好办法。

答案 1 :(得分:0)

也许,您可以创建一个Socket Wrapper或一个Observer,以便在初始化Socket实例时使用。

使用Aspcts(AOP),您可以截取所有Socket创建调用作为切入点,并启动一个新的TimeoutObserver作为一个Aspect。

此TimeoutObserver包含您自己的规则的实现,以检查套接字是打开还是关闭。

当您对公司软件中已实施和新实施的安全性时,该解决方案的优势在于不是侵入式AOP模型。

也许,这是一种处理这个问题的方法。

[]的,