2016-01-31 4 views
6

(socks4または5つのプロキシ経由で異なるサイトを要求するために)NettyクライアントでSocksプロキシを設定する必要があります。 は(www.socks-proxy.net、http://sockslist.net/などのような)自由靴下リストからプロキシの多くを試みたが、運を持つ:Netty Client(4.1)でSocks4/5プロキシハンドラを使用する方法

@Test 
public void testProxy() throws Exception { 
    final String ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; 
    final String host = "www.main.de"; 
    final int port = 80; 

    Bootstrap b = new Bootstrap(); 
    b.group(new NioEventLoopGroup()) 
      .channel(NioSocketChannel.class) 
      .handler(new ChannelInitializer<SocketChannel>() { 
       @Override 
       protected void initChannel(SocketChannel ch) throws Exception { 
        ChannelPipeline p = ch.pipeline(); 

        p.addLast(new HttpClientCodec()); 
        p.addLast(new HttpContentDecompressor()); 
        p.addLast(new HttpObjectAggregator(10_485_760)); 
        p.addLast(new ChannelInboundHandlerAdapter() { 
         @Override 
         public void channelActive(final ChannelHandlerContext ctx) throws Exception { 
          HttpRequest request = new DefaultFullHttpRequest(HTTP_1_1, GET, "/"); 
          request.headers().set(HOST, host + ":" + port); 
          request.headers().set(USER_AGENT, ua); 
          request.headers().set(CONNECTION, CLOSE); 

          ctx.writeAndFlush(request); 

          System.out.println("!sent"); 
         } 

         @Override 
         public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
          System.out.println("!answer"); 
          if (msg instanceof FullHttpResponse) { 
           FullHttpResponse httpResp = (FullHttpResponse) msg; 


           ByteBuf content = httpResp.content(); 
           String strContent = content.toString(UTF_8); 
           System.out.println("body: " + strContent); 

           finish.countDown(); 
           return; 
          } 

          super.channelRead(ctx, msg); 
         } 

         @Override 
         public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 
          cause.printStackTrace(System.err); 
          ctx.close(); 
          finish.countDown(); 
         } 
        }); 

        p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); 
       } 
      }); 

    b.connect(host, port).awaitUninterruptibly(); 
    System.out.println("!connected"); 

    finish.await(1, MINUTES); 
} 

接続がハング、リセットやいくつかの奇妙な例外を取得します。 どうしたの? 4.1からNettyにプロキシサポートが追加されました(4.1CRがあり、それ以前は4.1b7-8を試しました)

答えて

5

プロキシインスタンスは、パイプラインの最初のものにする必要があります。 HTTPコンテンツが処理される前に、まずプロキシを実行します。

、これを変更するにp.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678)));を変更するには、次のようにChannelPipelineのドキュメントで説明

p.addFirst(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); 

、データの流れは、最初のハンドラで始まり、そして最後のハンドラで終了されます。

+0

最初は、ありがとう! – yetanothercoder

関連する問題