【发布时间】:2018-06-24 19:26:06
【问题描述】:
上下文
作为我正在开发的软件的一部分,我根据RFC 1928 规范在 C# 中制作了一个 SOCKS 5 代理实现。代理服务器将在我的软件中本地运行(即它不在远程服务器上),它将用于将某些 HTTP / HTTPS 连接重定向到特定 IP 地址。
它应该如何工作/本地代理的原因
我的软件有点像一个启动器,可以启动.jar 文件。 java 程序接受指定代理服务器的可选参数,我想利用此功能将 java 程序发出的任何 HTTP 或 HTTPS 请求重定向到我自己的服务器。这就是代理服务器必须与代理客户端(java 程序)在同一台计算机上运行的原因。
我的问题
我正在使用一个简单的 java 程序测试这个代理,该程序试图通过我的代理从网站获取状态代码。由于某种原因,在不修改任何代码的情况下,Java 程序大约有 10 次抛出 SocketException (java.net.SocketException: Reply from SOCKS server has bad length),但在其他时候它可以正常工作并正确打印出 HTTP 响应代码。
我的尝试
如果我在单独的计算机或虚拟机上运行代理程序,它总是可以正常运行而不会出现任何错误(至少希望如此;我运行了 java 程序大约 20 次,它没有抛出异常)。在我的情况下,这不是一个可行的解决方案,因为代理必须在本地运行,作为我正在处理的程序的一部分。
我的代码
C# SOCKS 实现对于 SO 帖子来说太长了(约 100 行),所以我已将其上传到 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 地址。
【问题讨论】: