1. ホーム
  2. java

[解決済み] なぜ私のSOCKSプロキシコードはSocketExceptionをスローするのでしょうか?SOCKS サーバーからの不正な応答が発生するのはなぜですか?

2022-02-16 18:51:23

質問

SOCKS プロキシ コードがスローされるのはなぜですか? SocketException: Malformed reply from SOCKS server ? URLConnectionに設定したりしましたが、うまくいきません。唯一うまくいったのは、chilkat libですが、これは商用です。だから、私は、例えば、ASOCKSプロキシを経由してhttpリクエストを作るには?多分、そのためのいくつかの無料のライブラリが存在する?

例えば、そのコード。

    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);" になっています。

解決方法は?

本不具合の説明 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) {

}