如何在Netty客户端中使用Socks4 / 5代理处理程序(4.1)

我需要在Netty客户端配置socks代理(通过socks4或5个代理请求不同的站点)。 从免费袜子列表(如www.socks-proxy.net, http ://sockslist.net/等)尝试了很多代理,但没有运气:

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

连接挂起,重置或获得一些奇怪的exception。 怎么了? 代理支持从4.1开始添加到Netty(现在有一个4.1CR,尝试过它和4.1b7-8之前)

代理实例应该是管道中的第一个,因为您希望它在处理任何http内容之前首先处理与代理的连接。

要更改此设置,请更改p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); 至:

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

ChannelPipeline的文档中所述,数据流从第一个处理程序开始,到最后一个处理程序结束。