为什么我的SOCKS代理代码抛出SocketException: Malformed reply from SOCKS server?我尝试在URLConnection或其他地方设置,但这不起作用。唯一有效的东西-儿童图书馆,但这是商业性质的。那么,例如,我如何通过ASOCKS代理发出http请求?也许有一些免费的lib可以做到这一点?
例如,该代码:
SocketAddress addr = new InetSocketAddress(proxy_ip, proxy_port);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("google.com", 80);
try {
socket.connect(dest);
} catch (IOException ex) {
Logger.getLogger(CheckProxy.class.getName()).log(Level.SEVERE, null, ex);
}抛出异常:
java.net.SocketException: Malformed reply from SOCKS server
at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at proxychecker.CheckProxy.SocksCheck(CheckProxy.java:86)其中,第86行是"socket.connect(dest);“
发布于 2016-09-19 23:41:58
对此错误的解释:bugs.java.com/view_bug.do?bug_id=6964547
您需要使用以下代码手动更改Socket对象中的模式:
Class clazzSocks = socket.getClass();
Method setSockVersion = null;
Field sockImplField = null;
SocketImpl socksimpl = null;
try {
sockImplField = clazzSocks.getDeclaredField("impl");
sockImplField.setAccessible(true);
socksimpl = (SocketImpl) sockImplField.get(socket);
Class clazzSocksImpl = socksimpl.getClass();
setSockVersion = clazzSocksImpl.getDeclaredMethod("setV4");
setSockVersion.setAccessible(true);
if(null != setSockVersion){
setSockVersion.invoke(socksimpl);
}
sockImplField.set(socket, socksimpl);
} catch (Exception e) {
} 发布于 2014-12-01 07:07:06
SocketException: Malformed reply from SOCKS server这表明您根本没有SOCKS代理。它可能是一个HTTP代理。
注意你问错了问题。你的代码是正确的,是你的前置错误。
https://stackoverflow.com/questions/27215053
复制相似问题