2016-01-31 41 views
6

Potrzebuję skonfigurować proxy skarpet w klientach Netty (aby zażądać różnych witryn za pośrednictwem skarpet4 lub 5 serwerów proxy). Próbowałem wiele serwerów proxy z bezpłatnych wykazów skarpety (jak www.socks-proxy.net, http://sockslist.net/ etc), ale bez powodzenia:jak używać sterowników proxy Socks4/5 w 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); 
} 

Połączenie wiesza, resetuje lub uzyskanie jakieś dziwne wyjątki. Co jest nie tak? Obsługa proxy została dodana do Netty od wersji 4.1 (teraz jest 4.1CR, wypróbowana i 4.1b7-8 wcześniej)

Odpowiedz

5

Instancja proxy powinna być pierwszą w potoku, ponieważ ma obsłużyć połączenie z serwerem proxy najpierw, zanim zajdzie jakakolwiek zawartość http.

Aby to zmienić, należy zmienić p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); do:

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

Jak wyjaśniono w dokumentacji ChannelPipeline, przepływ danych jest począwszy od pierwszego przewodnika, a kończąc na ostatnim obsługi.

+0

wydaje się OK, jeśli po pierwsze, dziękuję! – yetanothercoder