【问题标题】:How to solve java.net.UnknownHostException from HttpURLConnection [duplicate]如何从 HttpURLConnection 解决 java.net.UnknownHostException [重复]
【发布时间】:2018-03-30 04:23:51
【问题描述】:

我正在尝试在远程服务器上实施 SMS 电话号码验证程序。下面的方法由 Servlet 调用,我正在尝试连接到 SMS 服务提供商,以便他们可以向指定的电话号码发送 SMS:

public static int sendPhoneNumberVerication(User user) throws SQLException, IOException, IllegalArgumentException, ClassNotFoundException
{
    String email = user.getEmail();
    String phoneNumber = user.getPhoneNumber();
    String verificationCode = getVerificationCode(email);
    String message = getPhoneVerificationMessage(user, verificationCode);
    //The sending SMS part
    String address = "https://www.bulksmsnigeria.com/api/v1/sms/create?api_token=fHTGT6PiRxIE1ZrMvOTDcsu0cM5yiQKz2EnWAXxQqkMt6UlAUHwHGIBFxQW4&from=Matonia&to=" + phoneNumber + "&body=" + message;
    URL url = new URL(address);
    //URL url = new URL("https", "www.bulksmsnigeria.com", 80, "/api/v1/sms/create?api_token=fHTGT6PiRxIE1ZrMvOTDcsu0cM5yiQKz2EnWAXxQqkMt6UlAUHwHGIBFxQW4&from=Matonia&to=" + phoneNumber + "&body=" + message);
    HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
    urlConn.setRequestMethod("POST");
    try(InputStream inputStream = urlConn.getInputStream())//<- Exception is throw here
    {
        byte[] bytes = new byte[inputStream.available()];
        inputStream.read(bytes);
        String content = new String(bytes);
        //Get the HTTP response status code
        int statusCode = urlConn.getResponseCode();
        return statusCode;
    }
}

执行 servlet 时,出现以下异常:

 java.net.UnknownHostException: www.
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:649)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:275)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1103)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:997)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.followRedirect0(HttpURLConnection.java:2645)
at sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2574)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1768)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at com.peer2peer.users.UserDAO.sendPhoneNumberVerication(UserDAO.java:406)
at com.peer2peer.users.UpdateProfileServlet.sendPhoneValidation(UpdateProfileServlet.java:261)
at com.peer2peer.users.UpdateProfileServlet.processRequest(UpdateProfileServlet.java:52)
at com.peer2peer.users.UpdateProfileServlet.doGet(UpdateProfileServlet.java:333)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at ...

当我尝试使用以下代码实例化 URL 时:

URL url = new URL("https", "www.bulksmsnigeria.com", 80, "/api/v1/sms/create?api_token=fHTGT6PiRxIE1ZrMvOTDcsu0cM5yiQKz2EnWAXxQqkMt6UlAUHwHGIBFxQW4&from=Matonia&to=" + phoneNumber + "&body=" + message);

我收到javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

如果我将https 更改为http,我会得到301 作为状态码。 但是,如果我在网络浏览器上运行 URL 地址,我会得到:

...我也收到了预期的短信!

我还检查了hereherehere,但我似乎没有从这些帖子中得到任何信息。 我不知道我在这里做错了什么。 请帮忙。

【问题讨论】:

    标签: java url httpurlconnection urlconnection


    【解决方案1】:

    那是因为 https 不使用 80 端口,而是使用 443 端口,请尝试以下操作:

    URL url = new URL("https", "www.bulksmsnigeria.com", 443, 
        "/api/v1/sms/create?api_token=fHTGT6PiRxIE1ZrMvOTDcsu0cM5yiQKz2EnWAXxQqkMt6UlAUHwHGIBFxQW4&from=Matonia&to=" + phoneNumber + "&body=" + message;
    

    【讨论】:

    • 让我试试...
    • 我仍然收到java.net.UnknownHostException: www.
    • 您确定服务器已连接到互联网吗?您可以尝试使用任何其他网址(例如https://www.google.com)吗?
    • 我运行代码的服务器是远程服务器,所以我确定它已连接到互联网。但是,我之前曾在另一台主机上使用过该代码(尽管它不是 HTTPS)并且它有效。
    • 您能否发布带有消息和电话号码实际值的代码,以便我可以按原样运行它?到目前为止,我还无法重现该错误。
    【解决方案2】:

    您网站的 HTTP 纯文本版本正在向 www. 发出无效重定向。当您使用 HTTPS 时,由于您连接到错误的 HTTPS 端口,它会提前失败。

    【讨论】:

    • 对不起,我没明白,请您详细说明一下?
    • 异常信息一目了然。 java.net.UnknownHostException: www. 的哪一部分你不明白?
    • @EJP 除非发布的代码与运行的代码不匹配,否则 URL 包含完整地址,只是 www
    • 但我没有发送到“www”。我使用了你看到的地址。
    • @M.leRutte 我同意,或者除非发布的错误消息与真实消息不符。只有 OP 可以澄清这一点,以及他想要回答的三个问题中的哪一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2013-04-21
    • 1970-01-01
    • 2012-06-26
    • 2018-06-22
    相关资源
    最近更新 更多