Java ConnectionTimeout与SocketTimeout

Java ConnectionTimeout与SocketTimeout,java,android,tcp,httpconnection,Java,Android,Tcp,Httpconnection,我使用的图书馆有问题。可能是图书馆,也可能是我用错了 基本上,当我这样做时(超时以毫秒为单位) 没有生成超时异常,它工作正常,但是,当我执行以下操作时 _ignitedHttp.setConnectionTimeout(60000); // 60 seconds _ignitedHttp.setSocketTimeout(1); // v short 我得到一个套接字异常 所以,我的问题是为什么我不能模拟连接异常?我是否误解了插座和连接超时之间的区别?该库(尚未正式发布)。

我使用的图书馆有问题。可能是图书馆,也可能是我用错了

基本上,当我这样做时(超时以毫秒为单位)

没有生成超时异常,它工作正常,但是,当我执行以下操作时

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short
我得到一个套接字异常


所以,我的问题是为什么我不能模拟连接异常?我是否误解了插座和连接超时之间的区别?该库(尚未正式发布)。

只有在启动TCP连接时才会发生连接超时。如果远程机器没有应答,通常会发生这种情况。这意味着服务器已关闭,您使用了错误的IP/DNS名称、错误的端口或与服务器的网络连接已关闭

套接字超时专用于监视连续的传入数据流。如果数据流在指定的超时时间内中断,则连接被视为暂停/断开。当然,这只适用于始终接收数据的连接

通过将套接字超时设置为1,这将需要每毫秒接收一次新数据(假设您按块读取数据并且块足够大)

如果只有传入流暂停超过一毫秒,则会出现超时。

连接超时是程序愿意等待以建立与另一进程的连接的最长时间。此时,您没有获取或发布任何应用程序数据,只是建立了连接本身


套接字超时是等待单个数据包时的超时。套接字超时是接收完整响应的超时,这是一个常见的误解。因此,如果套接字超时为1秒,并且响应由3个IP数据包组成,每个响应数据包需要0.9秒才能到达,总响应时间为2.7秒,那么就不会有超时。

如果服务器未关闭但太忙,您是否可以获得连接超时?或者这会是套接字超时吗?这取决于-如果TCP连接在服务器过载之前建立,则会出现套接字异常-否则会出现连接异常,表示无法建立TCP连接。考虑到较旧移动网络的高延迟,连接超时必须设置为几秒(例如10秒或更高的10000毫秒)。我只会在您不使用多个连接的情况下设置套接字超时,因为HTTP可以在请求后重新使用连接。这是否意味着如果您设置套接字超时(例如1分钟),则连接将在1分钟不活动后终止,如果没有设置超时,通常会在哪里重复使用?@Robert如果服务器太忙,则不一定会出现连接异常。它取决于平台,取决于服务器平台。套接字读取超时不会终止连接。它只会导致SocketTimeoutException。连接是否仍然可用是应用程序必须做出的决定。当然,API并没有说您不能在套接字上尝试更多的I/O。如果您使用多个连接,那么您关于不使用超时的声明就没有意义了。这里的误传太多了。1.所以我们可以说SocketTimeout只有在连接已经建立时才会出现吗?2.如果在收到3个数据包后的5分钟内没有数据流呢?收到第三个数据包后是否会出现SocketTimeout异常?@SaurabhPatil 1。对请参阅以获得确认。2.消息结束发送后,不需要进一步的数据,因此不会发生套接字超时。请参阅主题。我希望他们将“套接字超时”命名为“空闲超时”。如果套接字超时为1秒,并且响应由3个IP数据包组成,其中每个响应数据包需要0.8秒才能到达,在第一个和第二个数据包之间,间隔为0.3秒。然后,总响应时间仍然是2.7秒,但会有套接字超时。
_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short