Java HttpUrlConnection如何设置SO_KEEPALIVE

Java HttpUrlConnection如何设置SO_KEEPALIVE,java,http,Java,Http,有没有办法为JDK stdlibHttpUrlConnection设置套接字级别的选项(比如SO_KEEPALIVE)?我正试图找到一种方法来获取HTTP请求,这种方法不会成为偶尔“挂起”连接的牺牲品(这似乎是因为网络数据包丢失频繁发生)。一个更健壮的HTTP客户端。我知道有setReadTimeout方法,但我正试图找到一些方法,将TCP流重新推回到生活中,而不是像读取超时那样只是中止它。或者至少报告已发生连接故障,而不是永久挂起读取。但这也允许读取“在它想要的时候”返回,假设连接“仍然处于活

有没有办法为JDK stdlib
HttpUrlConnection
设置套接字级别的选项(比如SO_KEEPALIVE)?我正试图找到一种方法来获取HTTP请求,这种方法不会成为偶尔“挂起”连接的牺牲品(这似乎是因为网络数据包丢失频繁发生)。一个更健壮的HTTP客户端。我知道有
setReadTimeout
方法,但我正试图找到一些方法,将TCP流重新推回到生活中,而不是像读取超时那样只是中止它。或者至少报告已发生连接故障,而不是永久挂起读取。但这也允许读取“在它想要的时候”返回,假设连接“仍然处于活动状态”


经过一些检查,C层和Java层套接字的SO_KEEPALIVE默认值都是“off”。

这不是基于一个错误,而是基于三个错误

  • 因此,尽管TCP流的名称选择不当,但_KEEPALIVE并没有“将TCP流推回到生活中”。它只是在默认间隔两小时后检测到断开的连接。这不是你要找的

  • 读取超时不会中止连接。它抛出一个
    SocketTimeoutException
    。连接仍处于活动状态,后续读取可能会成功

  • 丢弃的数据包被检测并在TCP中重新传输


  • 使用读取超时

    您是否已使用HttpUrlConnection?Apache的HttpClient可能已经具备了您所需要的功能@drelliot我猜你是对的,请随意回答,我会接受:)对于追随者,是的,其他客户允许指定SO_KEEPALIVE(参见对话)。我希望SO_KEEPALIVE是周期性的,并以某种方式提醒对方“我没有收到你的最后一个数据包,请重新发送!”但似乎这是如此罕见,对方可能已经切断了连接。也就是说,至少发送端会用重置来响应,通知“嘿,这个管道坏了!”所以就像你说的,在我的场景中设置(大的)读取超时“和使用So_KEEPALIVE一样好”。但是,如果我希望很长的读取仍然成功(或者避免中间路由器上的活动超时),我可能仍然希望如此(是吗?:)@rogerdpack没有。所以KEEPALIVE没有做你想的。是的,我最初的希望似乎是“毫无根据的”,也许你误读或误解了我的评论?我是说,我现在明白了,它并没有达到我所希望的效果,但在某些情况下,它可能还有一些用处。干杯我读了你的评论“如果我想很长的阅读仍然成功。。。我可能仍然想要保持生命,是吗?答案仍然是“否”。好的,是的,对于这个问题,我的意思是“如果我想要很长的阅读时间来检测断开的连接”,很抱歉在这个问题上说错了,干杯!