上下文
作为正在开发的软件的一部分,我根据RFC 1928规范在C#中实现了SOCKS 5代理实现。代理服务器将在我的软件内部本地运行(即不在远程服务器上),它将用于将某些HTTP
/ HTTPS
连接重定向到特定的IP地址。
其工作方式/本地代理的原因
我的软件有点像启动器,可以启动.jar
文件。 Java程序接受指定代理服务器的可选参数,我想利用此功能将Java程序发出的任何HTTP
或HTTPS
请求重定向到我自己的服务器。这就是为什么代理服务器必须与代理客户端(java程序)在同一台计算机上运行的原因。
我的问题
我正在用一个简单的Java程序测试此代理,该程序试图通过我的代理从网站获取状态代码。由于某种原因,在不修改任何代码的情况下,Java程序每10个程序中大约有8次抛出SocketException(java.net.SocketException: Reply from SOCKS server has bad length
),但在其他时候,它可以正常工作并正确打印出HTTP响应代码。
我尝试过的事情
如果我在单独的计算机或虚拟机上运行代理程序,则该代理程序始终可以正常运行(至少希望;我运行Java程序约20次,并且没有引发异常)。就我而言,这不是可行的解决方案,因为代理必须作为我正在开发的程序的一部分在本地运行。
我的代码
对于SO帖子(约100行),C#SOCKS实现太长,因此我已将其上传到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地址。
答案 0 :(得分:0)
六个月的休息后,我刚刚重新访问了这个项目,并且找到了解决该问题的方法。在第70-73行,响应的前四个字节分别与writer.Write(...)
发送。我用一个写入调用替换了这四行,从而发送了包含四个值的数组(byte[4]
)。