【问题标题】:Socket inactivity timeout in javajava中的套接字不活动超时
【发布时间】:2009-09-30 14:21:10
【问题描述】:

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

如果我没有找到低级方法,我会在我们的连接中添加一个上次使用的值,并定期检查它……但我觉得那很难看。

谢谢,

安东尼

附:我不希望连接超时,我不确定是否理解 setSoTimeout,但我很确定这不是我们想要的。

P.P.S.当然,避免忘记结束会更好,但在大型项目 + 大型团队中……我们会尝试找到 100% 安全的方式。

【问题讨论】:

  • 你是对的,如果另一端只是停止监听,你就无法避免等待 read() 超时。所以这与连接超时或soTimeout无关。您将不得不使用一个单独的线程,它只会在锁上调用 wait(timeout) (并在每次读取之前禁用或重置超时,以便它不会在正常操作下关闭)。或者将整个网络模型改为非阻塞。

标签: java sockets timeout


【解决方案1】:

尝试开启 SO_KEEPALIVE:

s.setKeepAlive(true);

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

如果您的服务器以任何速度崩溃,这应该可以工作。如果您的服务器仍在运行,我不确定它是否会起作用 - 只是忽略客户端。

跟踪您创建的所有套接字并让一个线程定期检查每个套接字以查看它是否仍然打开并且最近被使用过,这会好得多。我不认为这很丑陋,我认为这可能是处理这个问题的最佳方式。

【讨论】:

  • 是的。很难在团队努力中找到任何强大的解决方案——因为我独立编写代码,我的第一个设计到达 run() { do { catch timeout exception; ) while (stayRunning);使用stayRunning 作为公共静态跟踪所有套接字等会出现同步()问题,但正如你所说,它并不难看。
【解决方案2】:

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

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

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

该解决方案的一个优势是非侵入式 AOP 模型,当您对公司软件中已经实施和新实施的安全性感到安全时。

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

[]的,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2014-10-09
    • 2018-07-16
    • 2013-04-24
    • 2011-12-18
    • 2013-02-28
    • 2013-09-08
    相关资源
    最近更新 更多