Java 为什么Apache公信器VFS考虑HTTP代理和SoCKS5代理,而忽略SoCKS4代理?

Java 为什么Apache公信器VFS考虑HTTP代理和SoCKS5代理,而忽略SoCKS4代理?,java,java-8,proxy,apache-commons-vfs,Java,Java 8,Proxy,Apache Commons Vfs,我正在开发一个连接到SFTP服务器并使用ApacheCommonsVFS下载文件的应用程序,它工作正常,但系统需要允许用户根据需要指定代理 现在,我知道Apache Commons VFS构建在Jsch之上,我知道Jsch包含以下类:com.jcraft.Jsch.ProxyHTTP、com.jcraft.Jsch.ProxySOCKS4和com.jcraft.Jsch.ProxySOCKS5 下面的代码是VFS类org.apache.commons.vfs2.provider.sftp.Sft

我正在开发一个连接到SFTP服务器并使用ApacheCommonsVFS下载文件的应用程序,它工作正常,但系统需要允许用户根据需要指定代理

现在,我知道Apache Commons VFS构建在Jsch之上,我知道Jsch包含以下类:com.jcraft.Jsch.ProxyHTTP、com.jcraft.Jsch.ProxySOCKS4和com.jcraft.Jsch.ProxySOCKS5

下面的代码是VFS类org.apache.commons.vfs2.provider.sftp.SftpClientFactory的摘录:

公共静态会话createConnection(
...
最终SftpFileSystemConfigBuilder.ProxyType-ProxyType=builder.getProxyType(文件系统选项);
...
最终字符串proxyUser=builder.getProxyUser(fileSystemOptions);
最终字符串proxyPassword=builder.getProxyPassword(fileSystemOptions);
Proxy=null;
if(SftpFileSystemConfigBuilder.PROXY_HTTP.equals(proxyType)){
proxy=createProxyHTTP(proxyHost,proxyPort);
((ProxyHTTP)proxy).setUserPassword(proxyUser,proxyPassword);
}else if(SftpFileSystemConfigBuilder.PROXY_SOCKS5.equals(proxyType)){
proxy=createProxySOCKS5(proxyHost,proxyPort);
((ProxySOCKS5)proxy).setUserPassword(proxyUser,proxyPassword);
}else if(SftpFileSystemConfigBuilder.PROXY_STREAM.equals(proxyType)){
proxy=createStreamProxy(proxyHost、proxyPort、fileSystemOptions、builder);
}
...
正如您所看到的,没有“if”语句来实例化ProxySOCKS4! 我复制了SFTPlientFactory类,将我的版本设置为在类路径上的原始类之前加载,并更改了代码,如下所示:

公共静态会话createConnection(
...
最终SftpFileSystemConfigBuilder.ProxyType-ProxyType=builder.getProxyType(文件系统选项);
...
最终字符串proxyUser=builder.getProxyUser(fileSystemOptions);
最终字符串proxyPassword=builder.getProxyPassword(fileSystemOptions);
Proxy=null;
if(SftpFileSystemConfigBuilder.PROXY_HTTP.equals(proxyType)){
proxy=createProxyHTTP(proxyHost,proxyPort);
((ProxyHTTP)proxy).setUserPassword(proxyUser,proxyPassword);
///更改开始(我还创建了PROXY_SOCKS4常量)
}else if(SftpFileSystemConfigBuilder.PROXY_SOCKS4.equals(proxyType)){
proxy=createProxySOCKS4(proxyHost,proxyPort);
((ProxySOCKS4)proxy).setUserPassword(proxyUser,proxyPassword);
///换头
}else if(SftpFileSystemConfigBuilder.PROXY_SOCKS5.equals(proxyType)){
proxy=createProxySOCKS5(proxyHost,proxyPort);
((ProxySOCKS5)proxy).setUserPassword(proxyUser,proxyPassword);
}else if(SftpFileSystemConfigBuilder.PROXY_STREAM.equals(proxyType)){
proxy=createStreamProxy(proxyHost、proxyPort、fileSystemOptions、builder);
}
...
…猜猜看,当我将应用程序设置为使用Socks 4代理时,上面的更改可以正常工作。重要的是,如果代理服务器是Socks 4类型,则将应用程序设置为使用Socks 5不起作用,这不仅适用于我使用VFS的应用程序,而且适用于我测试的任何其他客户端,如Fillezila或WinSCP

因此,主要问题是:
<强>为什么VFS预测使用PROXYHTTP,PROXOCSKS5,但完全忽略JSCH PROXOCSK4类?<强>我在这里丢失了一些SFTP或代理概念,还是应该考虑VFS窃听?这是我第一次使用VFS。


请以粗体为主要问题,不要过于宽泛。

< P>我没能及时找到或找到更好的答案,所以我解决问题的方法正是我在这个问题中所描述的。

我复制了类SftpClientFactory e SftpFileSystemConfigBuilder,进行了必要的调整,并使用它们来代替原始类,这很难看,我知道现在我只能使用特定的VFS版本,但问题已经解决了

下一次的教训:使用Jsch而不是VFS


不过,我会把这个问题留待讨论,以防其他人有合适的解决方案或答案。

我没能及时得到或找到更好的答案,所以我解决问题所做的正是我在问题中描述的

我复制了类SftpClientFactory e SftpFileSystemConfigBuilder,进行了必要的调整,并使用它们来代替原始类,这很难看,我知道现在我只能使用特定的VFS版本,但问题已经解决了

下一次的教训:使用Jsch而不是VFS

不过,我会把这个问题留待讨论,以防其他人有合适的解决方案或答案