如何在Netty客户端中使用Socks4 / 5代理处理程序(4.1) [英] how to use Socks4/5 Proxy Handlers in Netty Client (4.1)

查看:2495
本文介绍了如何在Netty客户端中使用Socks4 / 5代理处理程序(4.1)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to configure socks proxy in Netty client (to request different sites via socks4 or 5 proxies). Tried a lot of proxies from free socks lists (like www.socks-proxy.net, http://sockslist.net/ etc) but with no luck:

@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之前)

The connection hangs, resets or getting some strange exceptions. What's wrong? Proxy support added to Netty since 4.1 (now there is a 4.1CR, tried it and 4.1b7-8 before)

推荐答案

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

The proxy instance should be the first in the pipeline, as you want it to handle the connection to the proxy first, before any http contents are handled.

To改变这一点,改变 p.addLast(新的Socks4ProxyHandler(新的InetSocketAddress(149.202.68.167,37678))); 改为:

To change this, change p.addLast(new Socks4ProxyHandler(new InetSocketAddress("149.202.68.167", 37678))); to:

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

ChannelPipeline ,数据流程从第一个处理程序开始,在最后一个处理程序结束。

As explained in the documentation for ChannelPipeline, the flow of the data is starting at the first handler, and ending at the last handler.

这篇关于如何在Netty客户端中使用Socks4 / 5代理处理程序(4.1)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆