上下文
我基于
RFC 1928
规范是我正在开发的软件的一部分。代理服务器将在我的软件中本地运行(即,它不在远程服务器上),并将用于重定向某些
HTTP
/
HTTPS
到特定IP地址的连接。
它应该如何工作/本地代理的原因
我的软件就像一个发射器
.jar
文件。Java程序接受指定代理服务器的可选参数,并且我想利用这个特性来重定向任何一个代理服务器。
超文本传输协议
或
https协议
Java程序对我自己服务器的请求。这就是代理服务器必须与代理客户端(Java程序)在同一台计算机上运行的原因。
我的问题
我用一个简单的Java程序来测试这个代理程序,它试图通过我的代理从网站获得状态代码。出于某种原因,在不修改任何代码的情况下,Java程序中10次中大约有8次抛出SoCKExtExchange(
java.net.SocketException: Reply from SOCKS server has bad length
,但在其他时候,它工作并正确打印出HTTP响应代码。
我试过的
如果我在一台单独的计算机上或在一台虚拟机上运行代理程序,它总是工作不出错(至少是希望的;我运行Java程序20次,它没有抛出异常)。在我的情况下,这不是一个可行的解决方案,因为代理必须在本地运行,作为我正在开发的程序的一部分。
我的代码
对于一个SO POST(~ 100行)来说,c*ySOCKS实现太长了,所以我把它上传到
Pastebin
.
下面是我的Java测试代码。
public static void main(String[] args) throws Exception {
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 32128));
HttpURLConnection conn = (HttpURLConnection)(new URL("http://somedomain.com/")
.openConnection(proxy));
conn.setDoInput(true);
conn.setDoOutput(false);
conn.connect();
System.out.println(conn.getResponseCode());
}
问题
如果我将代理服务器托管在单独的计算机/vm上,但当我在本地托管(并使用)它时失败,那么为什么代理服务器会工作?当它在本地工作时,什么可能是看似随机的行为的原因,我如何修复它?
编辑:
我忘了提到代码目前只起到透明代理的作用,也就是说,它还没有将连接中继到其他IP地址。