applet中的Netty和代理服务器

时间:2013-01-17 15:58:12

标签: netty

我们在Java applet中使用Netty与tomcat服务器通信。这非常有效。

我可以使用下面发布的帮助程序类获取代理信息。

我的问题是如何向Netty提供代理服务器信息?

更多信息:

我们有一位用户在Internet Explorer中配置了代理服务器。网页和Java小程序得到了提供,但是当Netty尝试连接时,它会绕过代理服务器并进行直接连接;这会失败,因为用户已设置防火墙以防止直接连接 - 所有客户端连接都必须通过代理服务器。

获取代理信息的帮助程序代码:

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

public class ProxyConfig {

    private static final String JAVA_NET_USE_SYSTEM_PROXIES = "java.net.useSystemProxies";
    private static String host;
    private static int port;
    private static String protUrlStr = null;

    public static void init(URL url) {
        // http://10.0.1.136
        protUrlStr = url.getProtocol() + "://" + url.getHost();
        System.setProperty(JAVA_NET_USE_SYSTEM_PROXIES, "true");
        Proxy proxy = getProxy();
        if(proxy != null) {
            InetSocketAddress addr = (InetSocketAddress) proxy.address();
            if(addr != null) {
                host = addr.getHostName();
                port = addr.getPort();
                System.setProperty(JAVA_NET_USE_SYSTEM_PROXIES, "false");
                System.setProperty("http.proxyHost", host);
                System.setProperty("http.proxyPort", port + "");
            }
        }
        System.setProperty(JAVA_NET_USE_SYSTEM_PROXIES, "false");
    }

    public static String getHost() {
        return host;
    }

    public static int getPort() {
        return port;
    }

    private static Proxy getProxy() {
        List<Proxy> l = null;
        try {
            ProxySelector def = ProxySelector.getDefault();
            System.out.println("Getting List<Proxy> for URL = " + protUrlStr);
            l = def.select(new URI(protUrlStr));
            ProxySelector.setDefault(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(l != null) {
            for(Iterator<Proxy> iter = l.iterator(); iter.hasNext();) {
                java.net.Proxy proxy = iter.next();
                return proxy;
            }
        }
        return null;
    }
}

1 个答案:

答案 0 :(得分:5)

感谢您提出非常详细的问题。 HTTP和SOCKS代理支持尚未集成到Netty中。 Netty 3.6.2支持SOCKS,但它仅作为编解码器提供,因此您需要稍微调整一下以使其透明地工作。

目前缺乏适当的代理支持与Java NIO的工作方式有关,尽管Netty肯定能够将代理支持集成到其核心。如果有人愿意做出贡献,Netty项目团队将非常乐意审查该贡献并接受它。

如果您要仅使用Netty发送HTTP请求,您可能希望提供基于支持代理的Netty的专用HTTP客户端库,例如AsyncHttpClient