我的问题是:我需要发现一个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?或者存在另一种进行简单测试的方法吗?
答案 0 :(得分:1)
在查看grepCode后,我发现方法为connect(string host, int port):
打开连接到指定端口的远程主机的套接字 源自指定的本地地址和端口。之前 返回,调用_connect Action()来执行连接 初始化操作。
当端口被另一个服务打开时,套接字被打开,不会导致timeOut(通过套接字),但是" connectAction()"引发了异常。 所以我需要为我的SMTPClient设置一个全局timeOut,它由套接字连接和" connectAction()"内部使用。 。我这样做是为了解决我的问题:
smtp.setDefaultTimeout(timeOut);
有了这个,现在我已经预期的结果,开放端口抛出异常,当然还有成功连接SMTP服务。