java.net.Socket.setSoTimeout(...)什么时候抛出SocketException?

时间:2011-08-15 12:17:30

标签: java sockets exception

文档说Socket的{​​{1}}方法

  

抛出SocketException - 如果底层协议中存在错误,例如TCP错误

你有过这个例外吗?使用TCP套接字时,什么样的TCP错误会导致此方法抛出异常?

修改

让我尝试更具体,更深入。我不是在寻找可以在其他地方轻松找到的小事(例如,一个封闭的套接字会抛出此异常)。

假设刚刚创建,连接了setSoTimeout(int)(表示TCP连接),但尚未关闭。我还没有对它进行任何读/写操作。我在Linux(Ubuntu Server 11.04)上运行,所以我们可以忘记TCP实现不支持读取超时的情况。

现在,在这种情况下可以抛出这个异常吗?如果是这样,这是什么意思?它是特定于当前Socket实例的东西吗?如果我只是Socket它并以某种方式获得一个新的,它应该工作吗?这是一个我无法恢复的更大问题(例如操作系统中的问题),应该更好地关闭我的应用程序吗?

2 个答案:

答案 0 :(得分:2)

在这种情况下,如果套接字关闭或关闭,则抛出SocketException。 它也可以抛出以指示由本机TCP堆栈实现生成的错误。例如,如果您使用的是Windows,那么setSoTimeout可能会归结为Windows Winsock API中setsockopt函数的调用。此方法中的错误将指示winsock子系统中的某些更深层次的问题(无法初始化),或者如果您尝试在套接字上进行阻塞操作(例如,另一个线程)时设置套接字选项,则也可能抛出此错误。因此,您应该努力在创建时仅修改套接字选项,避免在连接套接字并开始对其进行I / O操作后更改任何选项。

如果您感到好奇,可以阅读更多here

答案 1 :(得分:0)

在关闭的套接字上调用java.net.SocketException时会抛出

setSoTimeout

与往常一样,使用forc .. source