【发布时间】:2018-07-17 11:39:42
【问题描述】:
我正在用 Java 制作一个从服务器下载特定文件的类。我有一种方法可以直接从 FTP 服务器下载,也可以从 SFTP 服务器下载。
如果不对主机名做出任何假设(不检查它是否以 ftp:// 或 sftp:// 开头,因为有时服务器可能是本地的),有没有办法确定服务器是 FTP 还是 SFTP ,因此使用哪种方法?
理想情况下,我想以编程方式确定,而不仅仅是在失败时尝试替代方案。提前感谢您的帮助!
编辑: 对于任何有兴趣的人,我非常基本且绝对不完美的解决方案是这样的:
private int determineServerProtocol(String host, String port) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try (Socket socket = new Socket(host, Integer.parseInt(port))) {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
result = in.readLine();
out.close();
in.close();
} catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
if (result.contains("SSH")) {
System.out.println("Server is SFTP");
// do things...
} else {
System.out.println("Server is FTP");
// do things...
}
}
【问题讨论】:
-
FTP 和 SFTP 是完全不相关的协议。一个有自己的知名 TCP 端口和自己的协议,并且通常具有匿名访问权限。 SFTP 是 SSH 协议的子协议,几乎没有匿名访问(也没有标准机制)。身份验证机制也非常不同。也许您的意思是 FTPS 而不是 SFTP? FTPS 只是 FTP 的 SSL/TLS 版本。
-
我正在编写一个程序来通过 FTP 与服务器通信,但将来会改为使用 SFTP。我想要一个能够以编程方式处理此更改的类,并在“轮询”服务器后确定要使用的协议。
-
@Spanner0jjm 你的解决方案有效吗?