Java Socket:为什么套接字没有“写超时”

mia*_*shu 6 java sockets

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

use*_*421 6

不会有太大用处。

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

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

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

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