2016-01-31 18 views
6

Мне нужно настроить прокси-сервер socks в клиенте Netty (запрашивать разные сайты через socks4 или 5 прокси). Пробовал много прокси из списков свободных носков (как www.socks-proxy.net, http://sockslist.net/ и т.д.), но не повез:Как использовать Socks4/5 Прокси-обработчики в Netty Client (4.1)

@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); 
} 

соединительного зависания, сбрасывает или получать какие-то странные исключения. Что случилось? Прокси-поддержка добавлена ​​в Netty с 4.1 (теперь есть 4.1CR, попробовал и 4.1b7-8 раньше)

ответ

5

Прокси-экземпляр должен быть первым в конвейере, так как вы хотите, чтобы он обрабатывал соединение с прокси, прежде чем обрабатывать содержимое http.

Чтобы это изменить, изменить p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); на:

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

Как объяснено в документации ChannelPipeline, поток данных, начиная с первого обработчика, и заканчивая последним обработчиком.

+0

похоже OK если сначала, спасибо! – yetanothercoder

Смежные вопросы