SocksSocketFactory.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.net;
  19. import java.io.IOException;
  20. import java.net.InetAddress;
  21. import java.net.InetSocketAddress;
  22. import java.net.Proxy;
  23. import java.net.Socket;
  24. import java.net.UnknownHostException;
  25. import javax.net.SocketFactory;
  26. import org.apache.hadoop.conf.Configurable;
  27. import org.apache.hadoop.conf.Configuration;
  28. /**
  29.  * Specialized SocketFactory to create sockets with a SOCKS proxy
  30.  */
  31. public class SocksSocketFactory extends SocketFactory implements
  32.     Configurable {
  33.   private Configuration conf;
  34.   private Proxy proxy;
  35.   /**
  36.    * Default empty constructor (for use with the reflection API).
  37.    */
  38.   public SocksSocketFactory() {
  39.     this.proxy = Proxy.NO_PROXY;
  40.   }
  41.   /**
  42.    * Constructor with a supplied Proxy
  43.    * 
  44.    * @param proxy the proxy to use to create sockets
  45.    */
  46.   public SocksSocketFactory(Proxy proxy) {
  47.     this.proxy = proxy;
  48.   }
  49.   /* @inheritDoc */
  50.   @Override
  51.   public Socket createSocket() throws IOException {
  52.     return new Socket(proxy);
  53.   }
  54.   /* @inheritDoc */
  55.   @Override
  56.   public Socket createSocket(InetAddress addr, int port) throws IOException {
  57.     Socket socket = createSocket();
  58.     socket.connect(new InetSocketAddress(addr, port));
  59.     return socket;
  60.   }
  61.   /* @inheritDoc */
  62.   @Override
  63.   public Socket createSocket(InetAddress addr, int port,
  64.       InetAddress localHostAddr, int localPort) throws IOException {
  65.     Socket socket = createSocket();
  66.     socket.bind(new InetSocketAddress(localHostAddr, localPort));
  67.     socket.connect(new InetSocketAddress(addr, port));
  68.     return socket;
  69.   }
  70.   /* @inheritDoc */
  71.   @Override
  72.   public Socket createSocket(String host, int port) throws IOException,
  73.       UnknownHostException {
  74.     Socket socket = createSocket();
  75.     socket.connect(new InetSocketAddress(host, port));
  76.     return socket;
  77.   }
  78.   /* @inheritDoc */
  79.   @Override
  80.   public Socket createSocket(String host, int port,
  81.       InetAddress localHostAddr, int localPort) throws IOException,
  82.       UnknownHostException {
  83.     Socket socket = createSocket();
  84.     socket.bind(new InetSocketAddress(localHostAddr, localPort));
  85.     socket.connect(new InetSocketAddress(host, port));
  86.     return socket;
  87.   }
  88.   /* @inheritDoc */
  89.   @Override
  90.   public int hashCode() {
  91.     return proxy.hashCode();
  92.   }
  93.   /* @inheritDoc */
  94.   @Override
  95.   public boolean equals(Object obj) {
  96.     if (this == obj)
  97.       return true;
  98.     if (obj == null)
  99.       return false;
  100.     if (!(obj instanceof SocksSocketFactory))
  101.       return false;
  102.     final SocksSocketFactory other = (SocksSocketFactory) obj;
  103.     if (proxy == null) {
  104.       if (other.proxy != null)
  105.         return false;
  106.     } else if (!proxy.equals(other.proxy))
  107.       return false;
  108.     return true;
  109.   }
  110.   /* @inheritDoc */
  111.   public Configuration getConf() {
  112.     return this.conf;
  113.   }
  114.   /* @inheritDoc */
  115.   public void setConf(Configuration conf) {
  116.     this.conf = conf;
  117.     String proxyStr = conf.get("hadoop.socks.server");
  118.     if ((proxyStr != null) && (proxyStr.length() > 0)) {
  119.       setProxy(proxyStr);
  120.     }
  121.   }
  122.   /**
  123.    * Set the proxy of this socket factory as described in the string
  124.    * parameter
  125.    * 
  126.    * @param proxyStr the proxy address using the format "host:port"
  127.    */
  128.   private void setProxy(String proxyStr) {
  129.     String[] strs = proxyStr.split(":", 2);
  130.     if (strs.length != 2)
  131.       throw new RuntimeException("Bad SOCKS proxy parameter: " + proxyStr);
  132.     String host = strs[0];
  133.     int port = Integer.parseInt(strs[1]);
  134.     this.proxy =
  135.         new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(host,
  136.             port));
  137.   }
  138. }