【问题标题】:SMTPClient set timout for an open portSMTPClient 为打开的端口设置超时
【发布时间】:2015-06-30 04:47:09
【问题描述】:

我的问题是:我需要发现一个 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;
}

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

java.net.SocketException:连接重置

如何为这种情况设置 timeOut?或者存在另一种方法来做我的简单测试?

【问题讨论】:

    标签: java smtp apache-commons


    【解决方案1】:

    查看grepCode后,我找到了方法connect(string host, int port)

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

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

    smtp.setDefaultTimeout(timeOut);
    

    有了这个,现在我有了预期的结果,打开会引发异常的端口,当然还有 SMTP 服务的成功连接。

    【讨论】:

    • smtp.setDefaultTimeout(timeOut); smtp.setConnectTimeout(timeOut); 这两行代码都应该有?
    • setConnectTimeout:设置连接超时时间,以毫秒为单位,将传递给 Socket 对象的 connect() 方法。 setDefaultTimeout:设置打开套接字时使用的默认超时时间(以毫秒为单位)。
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多