SMTPClient设置开放端口

时间:2015-04-22 13:27:16

标签: java smtp apache-commons

我的问题是:我需要发现一个IP和端口是否正在运行SMTP服务。 为此,我使用SMTPClient尝试打开连接。我正在使用下面的代码。

    private static boolean validateSMTP(String ip, int port, int timeOut) {
    SMTPClient smtp = new SMTPClient();

    try {
        smtp.setConnectTimeout(timeOut);            
        smtp.connect(ip, port);
        return true;

    } catch (SocketException e) {
        LogAplication.Warning("Ops... something wrong", e);
    } catch (IOException e) {
        LogAplication.Warning("Ops... something wrong", e);
    }
    finally{
        smtp = null;
    }

    return false;
}

它工作正常,我已经得到了预期的结果,但timeOut一直是我的问题。 例如:如果我尝试使用ip:127.0.0.1和端口80(IIS打开端口),则连接步骤需要很长时间(远超于超时中定义的)以引发异常

  

java.net.SocketException:连接重置

如何为此案例设置timeOut?或者存在另一种进行简单测试的方法吗?

1 个答案:

答案 0 :(得分:1)

在查看grepCode后,我发现方法为connect(string host, int port)

  

打开连接到指定端口的远程主机的套接字   源自指定的本地地址和端口。之前   返回,调用_connect Action()来执行连接   初始化操作。

当端口被另一个服务打开时,套接字被打开,不会导致timeOut(通过套接字),但是" connectAction()"引发了异常。 所以我需要为我的SMTPClient设置一个全局timeOut,它由套接字连接和" connectAction()"内部使用。 。我这样做是为了解决我的问题:

smtp.setDefaultTimeout(timeOut);

有了这个,现在我已经预期的结果,开放端口抛出异常,当然还有成功连接SMTP服务。