2013-06-06 2 views
2

2 개의 인터페이스가있는 GNU/Linux 서버에 대한 루트 액세스 권한이 있습니다. 여리고와 HtmlUnit을 사용하여 일부 웹 페이지를 크롤링하고 있습니다. HTTP 연결에 사용할 인터페이스를 지정하고 싶습니다. 명령 줄이나 Java에서이 작업을 수행 할 수있는 방법이 있습니까?Java 응용 프로그램을 인터페이스에 바인딩

답변

1

Java에서는 소켓을 사용하려는 NIC의 로컬 IP 주소에 바인드해야합니다. 0.0.0.0을 사용하는 경우 ALL에 바인드됩니다. 원하는대로 사용하도록 지정되었습니다.

+0

소켓에 액세스 할 수 없습니다. HtmlUnit에 URL을 제공하고 있습니다. – mossaab

+0

HtmlUnit Docu가 이것에 대해 뭐라 말 했나요? – Fildor

+0

아무 것도. 그것은 Apache Commons HttpClient를 호출하는 것입니다. Jericho는이 라이브러리를 사용하지 않습니다. 나는이 도서관들의 구체적 세부 사항을 조사하려고하고 있지 않다. 내가하려는 일은 "안녕, 자바, 모든 IP 호출마다 IP 주소 A.B.C.D를 사용하는 게 어떨까요?" – mossaab

2

HTTP 연결에 사용할 인터페이스를 지정하고 싶습니다.

각 네트워크 인터페이스에는 고유 한 IP 주소가 있습니다. 인터페이스의 IP 주소에있는 포트에 연결하여 인터페이스에 바인딩합니다.

소켓에 액세스 할 수 없습니다. HtmlUnit에 URL을 제공하고 있습니다. IP 주소 + 포트에 바인딩 -

당신이 소켓을 사용하는 여부는 (URL를 통해) 또는 HTTP 연결 (Socket/InetAddress를 통해), 당신은 동일한 방법을 사용합니다.

ip a 
ip link show 
/sbin/ifconfig -a 
lshw -class network 
  • 사용 자바 (java.net.NetworkInterface 클래스) :

    import java.io.*; 
    import java.net.*; 
    import java.util.*; 
    import static java.lang.System.out; 
    
    public class ListNIFs { 
        public static void main(String args[]) throws SocketException { 
         Enumeration<NetworkInterface> nets = 
          NetworkInterface.getNetworkInterfaces(); 
    
         for (NetworkInterface netIf : Collections.list(nets)) { 
          out.printf("Display name: %s\n", netIf.getDisplayName()); 
          out.printf("Name: %s\n", netIf.getName()); 
          Enumeration<InetAddress> inetAddresses = netIf.getInetAddresses(); 
          for (InetAddress add : Collections.list(inetAddresses)) { 
           out.printf("Address: %s\n", add.getName().getAddress().getHostAddress()); 
          } 
          displaySubInterfaces(netIf); 
          out.printf("\n"); 
         } 
        } 
    
        static void displaySubInterfaces(NetworkInterface netIf) throws SocketException { 
         Enumeration<NetworkInterface> subIfs = netIf.getSubInterfaces();    
         for (NetworkInterface subIf : Collections.list(subIfs)) { 
          out.printf("\tSub Interface Display name: %s\n", subIf.getDisplayName()); 
          out.printf("\tSub Interface Name: %s\n", subIf.getName()); 
          Enumeration<InetAddress> inetAddresses = subIf.getInetAddresses(); 
          for (InetAddress add : Collections.list(inetAddresses)) { 
           out.printf("\t Sub Interface Address: %s\n", add.getName().getAddress().getHostAddress()); 
          } 
         } 
         } 
    } 
    
  • 인터페이스가 어떤 주소 (들)

    • 사용 리눅스 명령이있는 결정,

      HTML 단위 : IP 주소와 포트

      를 지정하면 예, HTMLUnitWebClient를 호출하는 경우 :

      com.gargoylesoftware.htmlunit.html.HtmlPage page = 
          webClient.getPage("http://255.255.255.0:80/mypage"); 
      
      java.net.URL url = new java.net.URL("http://255.255.255.0:80/mypage"); 
      page = webClient.getPage(url); 
      
      com.gargoylesoftware.htmlunit.WebRequest req = 
          new com.gargoylesoftware.htmlunit.WebRequest(url, com.gargoylesoftware.htmlunit.HttpMethod.GET); 
      page = webClient.getPage(req); 
      
      :

      com.gargoylesoftware.htmlunit.WebClient webClient = new WebClient(); 
      com.gargoylesoftware.htmlunit.html.HtmlPage page = 
          webClient.getPage("http://mycompany.org/mypage"); 
      

      후 다음 중 하나를 수행 할 수 있습니다

      HTMLUnitHttpWebConnection :

      com.gargoylesoftware.htmlunit.HttpWebConnection conn = 
          new com.gargoylesoftware.htmlunit.HttpWebConnection(webClient); 
      java.net.URL url = new java.net.URL("http://255.255.255.0/mypage"); 
      com.gargoylesoftware.htmlunit.WebRequest req = 
          new com.gargoylesoftware.htmlunit.WebRequest(url, com.gargoylesoftware.htmlunit.HttpMethod.POST); 
      com.gargoylesoftware.htmlunit.WebRequest resp = conn.getResponse(req); 
      

      코어 자바 : 옵션은 자원 (파일, 웹 페이지 등)에 연결하는 URL을 생성 HTTP 연결

      에 대한 URL을 지정합니다. 호스트 문자열 (자동 DNS 조회) 또는 IP 주소와 함께 URL을 지정할 수 있습니다.(소켓 연결 용)

      가 URL 문자열 (DNS 조회)

      를 사용하여 IP 주소

      // 4 bytes: 
          byte[] ip4Address = {101,119,11,106}; 
          java.net.InetAddress addressObj = java.net.InetAddress.getByAddress(ip4Address); 
      
          // or use ip6Address, 16 bytes (2001:0db8:85a3:0000:0000:8a2e:0370:7334): 
          // Any hex value above 0x7f must be cast to byte, because byte is signed (-128 to 127) 
          byte[] ip6Address = {0x20,0x01,0x0d,(byte)0xb8,(byte)0x85,(byte)0xa3,0x00,0x00,0x00,0x00,(byte)0x8a,0x2e,0x03,0x70,0x73,0x34}; 
      

      사용의 InetAddress를 지정하려면 옵션 :

      // does not encode URL for you (manually include %20, etc) 
          java.net.URL url = 
           new URL("http://255.255.255.20:80/docs/books/tutorial/index.html?name=networking#DOWNLOADING"); 
          java.net.URL url2 = new URL("http", "255.255.255.20", 80, 
                 "/docs/books/tutorial/index.html?name=networking#DOWNLOADING"); 
          java.net.URL url3 = new java.net.URL("https://maps.google.com/maps?q=sydney"); 
          java.net.URL url4 = new java.net.URL("https", "maps.google.com", 80, "/maps?q=sydney"); 
      
          // does encoding of URL string for you 
          java.net.URI uri5 = new URI("http", "example.com", "/hello world/", ""); 
          java.net.URL url5 = uri2.toURL(); 
      
          // Can then pass URL to HTMLUnit, or invoke yourself 
          // (see Java Network Tutorial for details): 
      
          java.net.URLConnection conn = url.openConnection(); 
          java.net.HttpConnection httpConn = (HttpConnection)conn; 
          // preconnection: call setAllowUserInteraction/setDoInput/setDoOutput/  
          //      setIfModifiedSince/setUseCaches/setRequestProperty 
          httpConn.connect(); // or getInputStream/getOutputStream/getContent/getHeaderField 
          // postconnection: call getContentEncoding/getContentLength/getContentType 
          //      getDate/getExpiration/getLastModifed 
      

      코어 자바 : 선택적으로 포트를 추가 할 수 있습니다

      java.net.InetAddress addressObj = java.net.InetAddress.getByName("www.google.com"); 
    +0

    255.255.255.0은 내 인터페이스 중 하나의 로컬 IP 또는 mycompany.org의 원격 IP입니까? – mossaab

    +0

    소켓을 사용하여 호출하려는 인터페이스의 IP 주소입니다. 즉 페이지가 어디에 있든 - 아마도 mycompany.org –

    +0

    이것은 나에게 명확하지 않습니다. 내 인터페이스 중 하나에서 외부 웹 페이지에 연결하려고합니다. 따라서 호출해야하는 모든 메서드에는 외부 웹 사이트와 인터페이스의 IP가 모두 포함되어야합니다. – mossaab

    0

    두 가지 방법이 있습니다.

    자바에서
    1. , 키 포인트는 사용할 소스 주소를 지정하는 것입니다 호출 HttpConnection에 # open() 메서드 이전 :

      의 InetAddress favourateAddr = InetAddress를 (바이트 [] {1,2,3, 4}); // 1.2.3.4는 사용하려는 NIC의 IP 주소입니다.

      yourHTTPConnObj.setLocalAddress (favourateAddr);

      // http 연결을 엽니 다. yourHTTPConnObj.open();

    2. Linux에서는 NIC를 선택할 라우팅을 결정하는 것이 레이어 3 유틸리티입니다. 따라서 대상 주소를 사용하여 라우팅 테이블을 사용자 정의하여 연결을 강제로 시작해야합니다. 그것은 매우 간단합니다. 단 하나의 라우트 명령입니다. this link을 참조하십시오.

    +0

    'sudo/sbin/route add -host 8.8.8.8 dev eth1'을 시도했습니다. 하지만 8.8.8.8에서 ping을 실행하면'Destination Host Unreachable'이됩니다. – mossaab

    관련 문제