有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的socket不活动超时

我在socket java API中找不到一种方法来关闭一个超时毫秒打开的非活动连接。 目标是避免当我忘记显式关闭socket(并强制远程资源重新启动)时出现尴尬错误

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

谢谢

安托万

另外,我不希望连接超时,我也不确定是否理解设置超时,但我很确定这不是我们想要的

p.p.S.当然,避免忘记结束会更好,但是在一个大项目+大团队中。。。我们试图找到一个100%安全的方法


共 (2) 个答案

  1. # 1 楼答案

    请尝试启用“保持活力”:

    s.setKeepAlive(true);
    

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

    这应该可以在服务器崩溃的情况下工作。我不确定如果你的服务器还在运行,它是否会工作——只是忽略了客户端

    最好是跟踪您创建的所有套接字,并让线程定期检查每个套接字,看看它是否仍然处于打开状态,以及最近是否使用过。我不认为这很难看,我认为这可能是最好的处理方法

  2. # 2 楼答案

    也许,您可以创建一个套接字包装器,或者创建一个观察者,以便在初始化套接字实例时使用

    使用Aspcts(AOP),您可以截取所有套接字创建调用作为切入点,并启动一个新的TimeoutObserver作为一个方面

    此TimeoutObserver包含用于检查套接字是否打开或关闭的规则的实现

    该解决方案的一个优点是,当您对公司软件中已经实现的和新实现感到安全时,AOP模型不具有侵入性

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

    []的