2016-09-18 130 views
0

我需要在Java中使用IPv4地址(String或InetAddress對象 - 任何一個都可以)創建http或https URL對象。我已經在這裏待了10個小時了。如何使用Java中的InetAddress對象創建URL對象?

嘗試該撞牆描述如下:

  1. 嘗試#1:我試圖通過組裝串,然後將其饋送到一個URL構造,使URL。

    • 教科書聲明URL可以是「protocol:// host」,主機可以是主機名或IP地址。但創建一個這樣的URL:URL a = new URL("http://151.101.65.69");並打開一個流到此URL(a)給出一個HTTP錯誤500(內部服務器錯誤 - 發生意外的情況,服務器不知道如何處理)。
    • 讓我感到憤怒的是URL a = new URL("http://stackoverflow.com");的作品。
    • 在這一點上,我卡住了。我不知道要改變什麼,或者如何前進。
  2. 嘗試#2:我嘗試使用InetAddress類中的「getHostName()」方法對IP地址執行反向查找。

    • 這應該通過執行反向DNS查找來返回主機名稱。然而,我一直試圖爲151.101.65.69(stackoverflow網絡服務器的IP地址),並查找失敗。由於失敗,我的意思是IP地址作爲字符串而不是主機名作爲字符串返回。我閱讀了Oracle文檔http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html#getHostName(),但我不明白如何克服文檔提及的「安全管理器」(或者確實是反向查找失敗的原因)。
    • 我也試過「getCannonicalHostName()」,但那也沒有飛。
  3. 我想弄清楚如何使用IP地址打開網站。它看起來像我的瀏覽器遇到與我的代碼相同的問題。我閱讀了How to access site through IP address when website is on a shared host?,但我沒有任何用戶名,因爲我希望能夠打開任何用戶擁有IP地址的網站。添加端口(如80)似乎不起作用;也不會將用戶名留空或使用通用的「用戶」或「來賓」。

我需要的是從一個IPv4字符串或InetAddress對象創建一個URL對象,我卡住了。我知道一個像你這樣的知識淵博的程序員可能會說,從IP地址創建URL不是IP地址的目的,或者指出我沒有包含URL的文件部分,但這不是問題。你能幫我解決我的核心挑戰嗎?

+0

如果您在Web瀏覽器中加載「http:// 151.101.65.69」,會發生什麼情況? – chrylis

+0

@chrylis我收到一條錯誤消息:「Fastly error:unknown domain:151.101.65.69。Please check that this domain has been added to a service。」 – Mike

+0

我忘了在帖子中提到這個,但是我也收到了我嘗試的其他地址的消息,例如Google和Duckduckgo。 – Mike

回答

1

以下代碼適用於我。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.InetAddress; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.UnknownHostException; 

public class InetAddressMain { 

    public static void main(String[] args) { 
     try { 
      InetAddress addr = InetAddress.getByName("172.217.4.110"); 

      URL url = new URL("http://"+addr.getHostAddress()); 
      InputStream is = url.openStream(); 

      InputStreamReader isReader = new InputStreamReader(is); 
      BufferedReader reader = new BufferedReader(isReader); 
      String line; 
      while((line = reader.readLine()) != null){ 
       System.out.println(line); 
      } 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

輸出:

< DOCTYPE HTML > < HTML的itemscope = 「」 項目類型= 「http://schema.org/WebPage」 LANG = 「EN」 > <頭> <元內容=「搜索世界的信息,包括網頁,圖片,視頻等等。Google有許多特殊功能可以幫助您準確找到您要找的內容。」 ...[出於可讀性的原因縮短了輸出]

+0

這個答案很好,但是這段代碼並不總是有效。請參閱我的回答,以充分了解問題。 – Mike

0

答案由D.B.很好。我有非常相似的代碼;但你會發現這個代碼不會每次都有效。有一些IPv4地址傳遞給代碼提供D.B.的答案,它將無法打開URL流(例如,計算器的IP地址)。我認爲這個問題是我的編碼,而這正是我希望在stackoverflow上獲得幫助的。但是我現在意識到問題是我問這個問題時缺乏理解。我現在明白的是,擁有IPv4地址不足以打開網絡上的每個網站。只要服務器託管多個網站,就可以使用IP地址連接到服務器,但不能同時識別我們想要打開/訪問的網站。這位先生很好地解釋了這一點:http://ask-leo.com/why_doesnt_accessing_a_site_by_its_ip_address_work.html

@ D.B。感謝您花時間幫助。非常感激!