Java:连接超时和套接字超时

时间:2013-05-28 14:31:20

标签: java sockets connection timeout

我正在编写两个Junit测试用例来测试timemouts

@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
    }

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

我错过了其他任何超时吗?

提前致谢

3 个答案:

答案 0 :(得分:0)

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

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

对于读取超时,我假设你是'套接字超时'的意思,你必须调用URLConnection.setReadTimeout()。如果它发射,你将获得SocketTimeoutException。在这种情况下,零表示根据Javadoc的无穷大。

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

如果你想导致套接字连接超时异常(确切地获取诸如“java.net.SocketTimeoutException:connect timed out”之类的消息),只需使用URLConnection.setConnectTimeout(10),将参数设置为尽可能小,但为正;

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