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

时间:2018-01-30 14:01:08

标签: java sockets

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

2 个答案:

答案 0 :(得分:4)

它不会有多大用处。

通常,TCP发送与应用程序是异步的。 send()所做的就是将数据放入套接字发送缓冲区。然后它返回,而发送缓冲区异步清空到网络。所以没有什么可以超时的。没有超时并不表示数据已发送给对等方。

send()阻止,而发送缓冲区已满,并且可以实现超时,实际上您可以使用{{非阻塞模式自行执行此操作1}},但问题是超时可能是当前发送还是先前发送。因此,提供超时会相当混乱。相反,当所有TCP发送定时器在内部超时时传送的内容是连接重置。

  

我认为TCP协议中存在写入超时概念。

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

答案 1 :(得分:0)

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

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