【发布时间】:2018-07-09 10:47:38
【问题描述】:
有传递给connect方法的连接超时值,还有使用setSoTimeout方法设置的读取超时值。我想知道为什么没有设置“写入超时”的方法?我认为TCP协议中有写超时的概念。
【问题讨论】:
-
伟大的 StephenC 对Java socket output stream writes do they block 的回答为您提供了一些很好的信息。值得一读。
有传递给connect方法的连接超时值,还有使用setSoTimeout方法设置的读取超时值。我想知道为什么没有设置“写入超时”的方法?我认为TCP协议中有写超时的概念。
【问题讨论】:
你可以先尝试连接...如果连接失败捕获异常
InetSocketAddress sockAdr = new InetSocketAddress(serveradres, 2222);
Socket newsok = new Socket();
int timeout = 2000;
newsok.connect(sockAdr, timeout);
【讨论】:
用处不大。
一般而言,TCP 发送与应用程序是异步的。 send() 所做的只是将数据放入套接字发送缓冲区。然后它返回,同时发送缓冲区被异步清空到网络。所以没有什么可以超时的。而没有超时并不代表数据已经发送到对端了。
send() 阻塞 当发送缓冲区已满时, 并且可以对此实现超时,实际上您可以使用 select() 在非阻塞模式下自己执行此操作,但问题是超时可能是当前发送或之前的发送。因此,提供超时将相当混乱。相反,当所有 TCP 发送计时器在内部超时时传递的是连接重置。
我认为TCP协议中有写超时的概念。
确实存在,但这是在 TCP 异步清空套接字发送缓冲区的级别。它不受应用程序控制。
【讨论】: