Javaは、プロキシを使用してネットワーク接続方法の例を示す。


需要はこうです。
一、インタフェースではこのようないくつかの代理タイプがあります。
1.HTTPエージェント
2.Socks代理
3.プロキシを使わない(直結)
4.ブラウザ設定(ブラウザもHTTP、Socks、直結の3つ)を使用します。
QQ登録設定の代行能を参考にしてもいいです。実はqqの代理機能と同じです。
二、記入した代理配置情報を使って接続できるかどうかをテストします。
三、ユーザが最後に選択したプロキシ構成を記録し、デフォルトではユーザが最後に使用したプロキシ構成を使ってネットワーク接続を行う。
プログラム実行環境はWindowsXP、Windows 7、Windows 8システムです。
使う技術はJava 7、Swing、CXFです。
難点:
1.全居の代理設定はどうやって行いますか?

/**
 *     Bean
 * 
 * @author tang
 */
public class NetworkBean implements Serializable {
  private static final long serialVersionUID = 1L;
  // private static sun.misc.BASE64Encoder base64Encoder = new sun.misc.BASE64Encoder();
  private Proxy.Type type;//     
  private String address;// ip   
  private String port;//    
  private String username;//         
  private String password;//          
  private String domain;//  
  private String typeText;//          
  public NetworkBean() {
  }
  public NetworkBean(Type type, String address, String port, String username, String password) {
    this.type = type;
    this.address = address;
    this.port = port;
    this.username = username;
    this.password = password;
  }
  public NetworkBean(Type type, String address, String port, String username, String password, String domain) {
    super();
    this.type = type;
    this.address = address;
    this.port = port;
    this.username = username;
    this.password = password;
    this.domain = domain;
  }
  public Proxy.Type getType() {
    return type;
  }
  public void setType(Proxy.Type type) {
    this.type = type;
  }
  public String getAddress() {
    return address;
  }
  public void setAddress(String address) {
    this.address = address;
  }
  public String getPort() {
    return port;
  }
  public void setPort(String port) {
    this.port = port;
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getDomain() {
    return domain;
  }
  public void setDomain(String domain) {
    this.domain = domain;
  }
  public String getTypeText() {
    return typeText;
  }
  public void setTypeText(String typeText) {
    this.typeText = typeText;
  }
  /**
   * return domain + "\" + username
   */
  public String getDomainAndUsername() {
    return (Utils.toString(domain).trim().isEmpty()) ? username : domain.trim() + "\\" + username;
  }
  /**
   * return domain + "\" + username + ":" + password
   */
  public String getDomainAndUsernameAndPassword() {
    return getDomainAndUsername() + ":" + password;
  }
  /**
   * return username + ":" + password
   */
  public String getUsernameAndPassword() {
    return username + ":" + password;
  }
  /**
   * return (domain + "\" + username + ":" + password) to 64 bit
   */
  public String getDomainAndUsernameAndPassword64() {
    return org.apache.commons.codec.binary.Base64.encodeBase64String(getDomainAndUsernameAndPassword().getBytes());
  }
  @Override
  public String toString() {
    return "NetworkBean [type=" + type + ", typeText=" + typeText + ", address=" + address + ", port=" + port + ", username=" + username + ", password="
        + password + ", domain=" + domain + "]";
  }
}

/**
   *                     
   * 
   * @param networkBean
   */
  public static void setNetworkProxyBySystem(NetworkBean networkBean) {
    System.out.println("System Set Proxy : " + networkBean);
    if (isUserProxy(networkBean)) {
      if (networkBean.getType() == Proxy.Type.SOCKS) {
        System.getProperties().remove("http.proxyHost");
        System.getProperties().remove("http.proxyPort");
        System.getProperties().setProperty("socksProxyHost", networkBean.getAddress());
        System.getProperties().setProperty("socksProxyPort", networkBean.getPort());
      } else {
        System.getProperties().setProperty("http.proxyHost", networkBean.getAddress());
        System.getProperties().setProperty("http.proxyPort", networkBean.getPort());
      }
      Authenticator.setDefault(new BairuiAuthenticator(networkBean.getDomainAndUsername(), networkBean.getPassword()));
    } else if (networkBean != null) {
      System.getProperties().remove("proxySet");
      System.getProperties().remove("socksProxySet");
      System.getProperties().remove("http.proxyHost");
      System.getProperties().remove("http.proxyPort");
      System.getProperties().remove("socksProxyHost");
      System.getProperties().remove("socksProxyPort");
    }
  }
  /**
   *             
   */
  public static class BairuiAuthenticator extends Authenticator {
    private String username, password;
    public BairuiAuthenticator(String username, String password) {
      this.username = username;
      this.password = password;
    }
    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(username, password == null ? null : password.toCharArray());
    }
  }
2.CXFのServiceをどのようにシステムの代理店に使うか:

 /**
   *  WebService          :httpClientPolicy.setAllowChunking(false);
   * 
   * @param client
   */
  public static void setWebServiceSupportProxy(Client client) {
    HTTPConduit conduit = (HTTPConduit) client.getConduit();
    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
    httpClientPolicy.setAllowChunking(false);
    conduit.setClient(httpClientPolicy);
  }
3.ブラウザの設定を使う:

/**
   *                  
   * 
   * @return        null        
   */
  public static NetworkBean getBrowserProxy() {
    NetworkBean networkBean = new NetworkBean();
    networkBean.setTypeText(typeTexts[3]);
    networkBean.setType(Proxy.Type.DIRECT);
    String key = "reg query \"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\"";//         key
    try {
      Process exec = Runtime.getRuntime().exec(key);
      try (InputStreamReader i = new InputStreamReader(exec.getInputStream()); BufferedReader ir = new BufferedReader(i)) {
        for (String line = ir.readLine(); line != null; line = ir.readLine()) {
          if (line.indexOf("ProxyServer") >= 0) {
            String[] split1 = line.split("  ");
            if (split1.length > 3) {
              String[] split2 = split1[3].trim().split(":");
              if (split2.length > 1) {
                if (!Utils.toString(split2[0]).isEmpty() && !Utils.toString(split2[1]).isEmpty()) {
                  networkBean.setAddress(split2[0]);
                  networkBean.setPort(split2[1]);
                  networkBean.setType(Proxy.Type.HTTP);
                  break;
                }
              }
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    } catch (Exception e) {//         
      e.printStackTrace();
    }
    return networkBean;
  }
4.プロキシが利用可能かどうかをテストする
プログラムにはサーバの二つの異なるポートが使用されていますので、二つのポートが接続できるかどうかをテストする必要があります。
複数のサーバーを使ったら、さらに個別テストが必要です。

 /**
   *              ,         
   * 
   * @throws Exception
   */
  private static void testNetworkProxy() throws Exception {
    testWebService();
    testURLConnection();
  }
  /**
   *   CXF Service  50367  
   * 
   * @param networkBean
   * @throws Exception
   */
  public static void testWebService() throws Exception {
    JcptLoginService service = WebServiceUtils.getService(JcptLoginService.class, GeneralWebServiceAddress.LOGIN_SERVICE_URL_ADD);
    String result = service.getLoginPicture();
    System.out.println(result);
  }
  /**
   *  HttpURLConnection        ,          
   * 
   * @param connection
   * @throws Exception
   */
  private static void checkConnectionContent(HttpURLConnection connection) throws Exception {
    try (InputStream inputStream = connection.getInputStream()) {
      byte[] b = new byte[1024];
      boolean success = false;
      StringBuffer sb = new StringBuffer();
      for (int i = inputStream.read(b); i > 0; i = inputStream.read(b)) {
        String tempStr = new String(b, 0, i);
        sb.append(tempStr);
        if (tempStr.indexOf("3,file not found") >= 0) {// service         ,  service          
          success = true;
          break;
        }
      }
      if (!success) {
        String str = sb.toString();
        if (str.length() > 3) {
          char char0 = str.charAt(0);
          char char1 = str.charAt(1);
          if (Utils.isNumber(char0 + "") && char1 == ',') {
            success = true;
          }
        }
      }
      if (!success) {
        throw new RuntimeException("result content does not meet expectations.");
      }
    } catch (Exception ex) {
      throw ex;
    }
  }
  /**
   *         9067  
   * 
   * @param networkBean
   * @throws Exception
   */
  public static void testURLConnection() throws Exception {
    HttpURLConnection connection = (HttpURLConnection) new URL(GeneralWebServiceAddress.FILE_DOWN_URL_ADD + "path=").openConnection();
    checkConnectionContent(connection);
  }

 /**
   *          
   */
  private void testProxyConnection() {
    NetworkBean readNetworkBean = NetworkProxyTool.readNetworkBean();//         NetworkBean
    try {
      NetworkBean networkBean = createNetworkBean();//             NetworkBean  
      showTestResultDialog(NetworkProxyTool.testNetworkProxyBySystem(networkBean));
    } catch (Exception ex) {
      showTestResultDialog(false);
    }
    NetworkProxyTool.setNetworkProxyBySystem(readNetworkBean);//     ,     NetworkBean
  }
5.Javaはネットワークに接続する時、現在のプロキシを使って接続に失敗したら、オペレーティングシステムにキャッシュされているプロキシを使ってネットワーク接続を行います。接続をテストする時はオペレーティングシステムのキャッシュを使用しませんが、テストが終わったらオペレーティングシステムのキャッシュを使います。

 /**
   *                 
   * 
   * @param keepAlive
   */
  public static void setKeepAliveAndAuthCache(boolean keepAlive) {
    System.setProperty("http.keepAlive", keepAlive + "");//          ,   false         (       ,               )
    if (keepAlive) {
      AuthCacheValue.setAuthCache(new AuthCacheImpl());
    } else {
      //         AuthCache              
      AuthCacheValue.setAuthCache(new AuthCache() {
        public void remove(String pkey, AuthCacheValue entry) {
        }
        public void put(String pkey, AuthCacheValue value) {
        }
        public AuthCacheValue get(String pkey, String skey) {
          return null;
        }
      });
    }
  }
ログイン前:

  NetworkProxyTool.setKeepAliveAndAuthCache(false);
  new.Login();
ログイン成功後:

 NetworkProxyTool.setKeepAliveAndAuthCache(true);
6.ユーザのプロキシ設定を保存する:
カスタムタイプのオブジェクトを直接プログレッシブにすると、バージョンに問題があります。
したがって、直接にカスタムクラスのオブジェクトを並べ替えることはできません。2番目は、カスタムクラスのオブジェクトの属性を辞書(Map)に変換して、mapを順番に並べます。

/**
   *               
   * 
   * @return
   */
  public static NetworkBean readNetworkBean() {
    NetworkBean networkBean = getCurrNetworkBean(readNetworkBeanMap());
    if (networkBean == null) {
      networkBean = new NetworkBean();
      networkBean.setType(Proxy.Type.DIRECT);
    }
    return networkBean;
  }
  /**
   *               
   * 
   * @param map
   * @return
   */
  public static NetworkBean getCurrNetworkBean(Map<String, Object> map) {
    putBrowserProxy(map);
    return (NetworkBean) map.get(getTypeMapKey(map));
  }
  /**
   *                  map
   * 
   * @param map
   */
  private static void putBrowserProxy(Map<String, Object> map) {
    if (browserProxyBean == null) {
      browserProxyBean = getBrowserProxy();
    }
    NetworkBean networkBeanBrowser = (NetworkBean) map.get(key_browser);
    if (networkBeanBrowser == null) {
      networkBeanBrowser = browserProxyBean;
    }
    if ((Utils.toString(browserProxyBean.getAddress()).isEmpty() || !browserProxyBean.getAddress().equals(networkBeanBrowser.getAddress()))
        || (Utils.toString(browserProxyBean.getPort()).isEmpty() || !browserProxyBean.getPort().equals(networkBeanBrowser.getPort()))) {
      networkBeanBrowser.setUsername(null);
      networkBeanBrowser.setPassword(null);
      networkBeanBrowser.setDomain(null);
    }
    networkBeanBrowser.setType(browserProxyBean.getType());
    networkBeanBrowser.setTypeText(browserProxyBean.getTypeText());
    networkBeanBrowser.setAddress(browserProxyBean.getAddress());
    networkBeanBrowser.setPort(browserProxyBean.getPort());
    map.put(key_browser, networkBeanBrowser);
  }
ログイン前:

  NetworkBean networkBean = NetworkProxyTool.readNetworkBean();
  NetworkProxyTool.setNetworkProxyBySystem(networkBean);
  NetworkProxyTool.setKeepAliveAndAuthCache(false);
  new.Login();
ユーザー設定が完了したら、エージェントをクリックして確定する時:

 /**
   *     
   */
  private void confirm() {

    if ((isHttp() || isSocks()) && !checkIpAndPortNotNull()) {
      return;
    }
    NetworkBean networkBean = createNetworkBean();
    if (isHttp()) {// HTTP  
      if (networkBean.getDomain() != null) {
        networkBean.setDomain(networkBean.getDomain().trim());
      }
      proxySettingMap.put(key_http, networkBean);
      proxySettingMap.put(key_proxy_type, key_http);
    } else if (isSocks()) {// SOCKS  
      proxySettingMap.put(key_socks, networkBean);
      proxySettingMap.put(key_proxy_type, key_socks);
    } else if (isBrowser()) {
      proxySettingMap.put(key_browser, networkBean);
      proxySettingMap.put(key_proxy_type, key_browser);
    } else {
      proxySettingMap.put(key_direct, networkBean);
      proxySettingMap.put(key_proxy_type, key_direct);
    }
    userCurrShowNetworkBean = networkBean;
    isConfirm = true;
    setVisible(false);
    NetworkProxyTool.saveNetworkProxyConfig(proxySettingMap);
  }
System Properties
Java System Propertiesネットワークはどれらのkeyがありますか?
http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html
http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
Java System Properties優先度説明
ホストとポートはセットより優先度が高い、つまりセットは設定しなくても良い。
http.proxyHostとhttp.proxyPortが存在する場合、proxySetはfalseとして無効となり、システムはhttpエージェントを使用することができます。
socks ProxyHostとsocks ProxyPortが存在する時、socks ProxySetはfalseに設定して無効にして、システムは依然としてsocks代理を使うことができます。
httpはsocksより優先度が高い、つまりhttp.proxyHostとhttp.proxyPortがある時、socks Proxy Set、socks ProxyHost、socks ProxyPortは失効します。システムはhttpエージェントを使います。
java.net.Proxyを使う
単一の接続だけで代理が必要なら、Proxy類を採用して代理接続を行うことができます。
説明:
1.Socketはsocksエージェントしか使えません。httpエージェントは使えません。
2.ソケットはAuthenticatorを用いて検証する。
3.URLConnectはRequest Propertyを使用することは、現在の接続に対してのみ有効で、キャッシュされません。Authenticatorはグローバルで、すべてのネットワーク要求に対して有効で、キャッシュされますが、Request Propertyの優先度はAuthenticatorより高いです。
4.Request Propertyのみ64ビットコードが必要で、Authenticatorは必要ありません。
5.検証キャッシュをクリアする必要がある場合、検証キャッシュの上にコードがすでにありました。ここでは繰り返し書きません。
6.実は、グローバルな代理接続を採用することを提案しています。URLConnectionもSocketも簡単で便利で統一しています。
コード:

NetworkBean httpBean = new NetworkBean(Proxy.Type.HTTP, "192.168.77.5", "8888", "tzc", "123", null);
Proxy httpProxy = new Proxy(httpBean.getType(), new InetSocketAddress(httpBean.getAddress(), Integer.parseInt(httpBean.getPort())));
NetworkBean socksBean = new NetworkBean(Proxy.Type.SOCKS, "192.168.77.5", "9999", "tzc", "123", "ttt");
Proxy socksProxy = new Proxy(socksBean.getType(), new InetSocketAddress(socksBean.getAddress(), Integer.parseInt(socksBean.getPort())));
URLConnection httpProxyConnection = new URL("http://www.baidu.com/").openConnection(httpProxy);
//  Authenticator.setDefault(new BairuiAuthenticator(networkBean.getDomainAndUsername(), networkBean.getPassword()));
httpProxyConnection.setRequestProperty("Proxy-Authorization", "Basic "+httpBean.getDomainAndUsernameAndPassword64());
URLConnection socksProxyConnection = new URL("http://www.baidu.com/").openConnection(socksProxy);
//  Authenticator.setDefault(new BairuiAuthenticator(networkBean.getDomainAndUsername(), networkBean.getPassword()));
socksProxyConnection.setRequestProperty("Proxy-Authorization", "Basic "+httpBean.getDomainAndUsernameAndPassword64());
Socket socket = new Socket(socksProxy);
Authenticator.setDefault(new BairuiAuthenticator(networkBean.getDomainAndUsername(), networkBean.getPassword()));
socket.connect(new InetSocketAddress("www.baidu.com", 5555));
締め括りをつける
以上はJava使用代理によるネットワーク接続方法の例の全部の内容です。Javaを勉強するのに役立つと思います。本サイトの他のテーマをご覧になり、いつでもメッセージを残してください。