1

我对 Java 有点陌生,但是在尝试通过 SQUID HTTP 代理将本地文件上传到远程 FTP 服务器时遇到了一个问题(请注意,这显然束缚了我的双手,因此 'FTP' 和 'SOCKS' 代理类型不在范围内)。

所以这是我的代码:

                       URL url = new URL(urlString);
                       OutputStream os ;                             

                       System.setProperty("proxySet", "true");
                       System.setProperty("proxyHost", proxyHost.trim());
                       System.setProperty("proxyPort", proxyPort.stringValue());


                       URLConnection ftpConn = url.openConnection() ;
                       ftpConn.setAllowUserInteraction(true); //threw this in to see if it would work, does nothing
                       ftpConn.setDoOutput(true); //here is where I set the setDoOutput
                       os = ftpConn.getOutputStream(); //here is where the exception occurs

我不断收到此异常:

Java 调用因未捕获的 Java 异常而终止:java.net.ProtocolException:如果 doOutput=false,则无法写入 URLConnection - 调用 setDoOutput(true)

所以我用FTPURLConnection等尝试过这个并且遇到了同样的问题。

调试时,似乎在 ftpConn 中有不少于三个称为doOutput的变量。
只有一个是可编辑的(而其他两个不是)

第一个(似乎是通过getDoOutput返回的那个)在设置ftpConn.setDoOutput(true);后返回true ;.

查看HttpURLConnection 的源代码:

 public synchronized OutputStream getOutputStream()
                    throws IOException {

                try {
                    if (!doOutput) {
                        throw new ProtocolException(
                                "cannot write to a URLConnection"
                                        + " if doOutput=false - call setDoOutput(true)");
                    }

查看FtpURLConnection中的代理处理让我相信,当它确定您正在使用 HTTP 代理时,它会将处理传递给 HttpURLConnection。

这是我认为发生断开连接的地方(对于我或图书馆或代理)。

我是否错过了设置setDoOutput或其他东西的方法?

我已经能够成功地从 GET 代理中隧道出来,但是在 doOutput 上 PUT 都失败了。

感谢您提供任何帮助或指示以使其正常工作。

PS我正在使用Java 1.5.0_10(我们在这里与其他应用程序保持一致)

4

1 回答 1

0

很好地发现这是 metalink 中的一个错误(错误 6519647)。解决方法几乎是使用不同的东西!

(无论代理如何设置(使用/不使用“http.”,甚至通过代理类),此错误仍然存​​在

抱歉重复编辑/答案,这是我对自己问题的第一个“答案”。

切换了 ftp4j 但仍然遇到 squid 代理问题(这是一个完全不同的故事)。

于 2011-06-27T15:38:10.180 回答