2016-09-18 101 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。感谢您花时间帮助。非常感激!