【问题标题】:Java Socket:why is there is no "write timeout" for the socketJava Socket:为什么套接字没有“写超时”
【发布时间】:2018-07-09 10:47:38
【问题描述】:

有传递给connect方法的连接超时值,还有使用setSoTimeout方法设置的读取超时值。我想知道为什么没有设置“写入超时”的方法?我认为TCP协议中有写超时的概念。

【问题讨论】:

标签: java sockets


【解决方案1】:

你可以先尝试连接...如果连接失败捕获异常

InetSocketAddress sockAdr = new InetSocketAddress(serveradres, 2222);
Socket newsok = new Socket();
int timeout = 2000;
newsok.connect(sockAdr, timeout);

【讨论】:

    【解决方案2】:

    用处不大。

    一般而言,TCP 发送与应用程序是异步的。 send() 所做的只是将数据放入套接字发送缓冲区。然后它返回,同时发送缓冲区被异步清空到网络。所以没有什么可以超时的。而没有超时并不代表数据已经发送到对端了。

    send() 阻塞 当发送缓冲区已满时, 并且可以对此实现超时,实际上您可以使用 select() 在非阻塞模式下自己执行此操作,但问题是超时可能是当前发送或之前的发送。因此,提供超时将相当混乱。相反,当所有 TCP 发送计时器在内部超时时传递的是连接重置。

    我认为TCP协议中有写超时的概念。

    确实存在,但这是在 TCP 异步清空套接字发送缓冲区的级别。它不受应用程序控制。

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 2012-07-30
      • 2019-02-27
      • 2020-12-22
      • 2013-05-23
      • 2013-07-01
      • 2018-11-01
      • 1970-01-01
      • 2014-11-19
      相关资源
      最近更新 更多