我对 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 ;.
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(我们在这里与其他应用程序保持一致)