如何使用Java中的InetAddress对象创建URL对象?

时间:2016-09-18 01:44:32

标签: java oracle http url inetaddress

我需要在Java中使用IPv4地址(String或InetAddress对象 - 一个没问题)创建一个http或https URL对象。我现在已经在这10个小时了。

尝试碰到下面描述的墙:

  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 web服务器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)似乎不起作用;也不会将用户名留空或使用通用的“用户”或“访客”。

  4. 我需要从IPv4 String或InetAddress对象创建一个URL对象,我被困住了。我知道像你这样知识渊博的程序员可能会说从IP地址制作URL不是IP地址的用途,或者指出我没有包含URL的文件部分,但这不是问题。你能帮助我解决我的核心挑战吗?

2 个答案:

答案 0 :(得分: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();
        }
    }

}

<强>输出:

&lt;!doctype html&gt;&lt; html itemscope =“”itemtype =“http://schema.org/WebPage”lang =“en”&gt;&lt; head&gt;&lt; meta content =“搜索世界的信息,包括网页,图片,视频等.Google有许多特殊功能可以帮助您找到您想要的内容。“ ... [缩短了可读性的输出]

答案 1 :(得分:0)

答案由D.B.提供。很好。我有非常相似的代码;但是你会发现这段代码每次都不起作用。您传递给代码的IPv4地址是D.B.的答案,它无法打开URL流(例如stackoverflow的IP地址)。我认为问题是我的编码,这就是我希望在stackoverflow上获得帮助。但我现在意识到问题是在提出这个问题时我缺乏理解。我现在理解的是,拥有IPv4地址不足以打开网络上的每个网站。只要服务器托管多个网站,IP地址就可以用来连接服务器,但不能同时识别我们想要打开/访问的网站。这位先生很好地解释了这一点:http://ask-leo.com/why_doesnt_accessing_a_site_by_its_ip_address_work.html

@ D.B。感谢您抽出宝贵时间提供帮助。非常感谢!