5

JavaアプレットでNettyを使用して、Tomcatサーバーと通信します。これは完全に機能します。

下記のヘルパークラスを利用してプロキシ情報を取得することができます。

私の質問は、プロキシサーバー情報をNettyに提供するにはどうすればよいですか?

詳しくは:

InternetExplorerでプロキシサーバーを構成したユーザーがいます。Webページと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;
    }
}
4

1 に答える 1

5

非常に詳細な質問をありがとう。HTTP と SOCKS の両方のプロキシ サポートは、まだ Netty に統合されていません。Netty 3.6.2 は SOCKS をサポートしていますが、コーデックとしてのみ提供されているため、透過的に動作させるには少し調整する必要があります。

現在適切なプロキシ サポートがないのは、Java NIO の動作に関連していますが、Netty はプロキシ サポートをそのコアに確実に統合できます。誰かが喜んで貢献してくれれば、Netty プロジェクト チームは喜んで貢献を検討し、受け入れます。

Netty のみで HTTP リクエストを送信する場合は、AsyncHttpClientなどのプロキシをサポートする Netty ベースの専用 HTTP クライアント ライブラリを提供することをお勧めします。

于 2013-01-18T05:03:28.697 に答える