【问题标题】:Java: Connection Timedout and Socket TimedoutJava:连接超时和套接字超时
【发布时间】:2013-05-23 13:56:43
【问题描述】:

我正在编写两个用于测试超时的 Junit 测试用例

@Test
    public void connectionTimeoutTest()
    {
        String myurl = "http://serverip:serverport/context";
        URL url = new URL(myurl);
        URLConnection con = url.openConnection();

        //how to check connectionTimeout but not socket time out

        //what I think
        //is it good enough to check with a server ip that does not exist ?
    }

    @Test
    public void socketTimeoutTest()
    {
        String myurl = "http://localhost:serverport/context";
        URL url = new URL(myurl);
        URLConnection con = url.openConnection();

        //how to check successful connection and timesout at socket (or port)

        //what I think
        //IP should exist (so it is localhost) but should not be listening on the port
    }

我在这里感到困惑,因为我不确定我的方法是否正确。每种情况有哪些例外?另外,是否可以根据 Exceptions 进行区分?

还有其他我错过的时间吗?

提前致谢

【问题讨论】:

    标签: java sockets connection timeout


    【解决方案1】:

    在打开任何流或获取响应代码之前,您需要调用 URLConnection.setConnectTimeout()。如果发生连接超时,它将抛出带有文本“连接超时”的ConnectException

    请注意,与 Javadoc 不同,默认连接超时约为一分钟(取决于平台),而不是无限长,您可以通过这种方式减少默认连接超时,但不能增加它。

    对于读取超时,我假设这就是您所说的“套接字超时”,您必须调用 URLConnection.setReadTimeout()。如果它触发,您将获得SocketTimeoutException。在这种情况下,根据 Javadoc,零确实意味着无穷大。

    【讨论】:

      【解决方案2】:

      我不太清楚您的单元测试要求。如果您要测试服务器的连接(和套接字读取)超时值,上述方法将只允许您验证某个“最大”阈值。但是您仍然无法确认 TCP 服务器端超时设置。 TCP 服务器的连接(和读取)超时取决于平台 (OS) 和 TCP 堆栈实现等因素。

      同样,通过setConnectTimeoutsetReadTimeout() 的超时设置仅在客户端套接字上,当与此 URLConnection 引用的资源通信时。

      【讨论】:

        【解决方案3】:

        在第一个测试用例中,我认为它会得到 java.net.UnknownHostException,因为不存在 ip 地址。

        如果你想引起套接字连接超时异常(确切地得到类似“java.net.SocketTimeoutException:连接超时”的消息),只需使用URLConnection.setConnectTimeout(10),将参数设置为尽可能小,但为正;

        同样在第二个测试用例中,可以使用 URLConnection.setReadTimeout(10) 导致读取超时异常(“java.net.SocketTimeoutException: Read timed out”)。

        【讨论】:

        • 你不能得到'java,net SocketTimeoutException:连接超时'。连接超时报告为 ConnectExceptions,而不是 SocketTimeoutExceptions。
        • public static void testConnectTimeout(){ final String url = "stackoverflow.com";尝试 { HttpURLConnection connect = (HttpURLConnection)new URL(url).openConnection(); connect.setRequestMethod("GET");连接.setConnectTimeout(10);连接.连接(); } catch (MalformedURLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } 代码段,试试看吧……
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2012-11-17
        • 2011-02-05
        • 2018-11-26
        相关资源
        最近更新 更多