2

この Web サービスを呼び出すと、unknownhost 例外が発生することがあります

これは、Web サービスから情報を取得するために使用した方法です。

String response = null;
         URL url;
         HttpsURLConnection con = null;

         try {

            // Create a context that doesn't check certificates.
                SSLContext ssl_ctx = SSLContext.getInstance("TLS");
                TrustManager[ ] trust_mgr = get_trust_mgr();
                ssl_ctx.init(null,                // key manager
                             trust_mgr,           // trust manager
                             new SecureRandom()); // random number generator
                HttpsURLConnection.setDefaultSSLSocketFactory(ssl_ctx.getSocketFactory());

            url = new URL("https://example.org/v1/user/login/");

            HttpsURLConnection con = (HttpsURLConnection)url.openConnection();

            // Guard against "bad hostname" errors during handshake.
                con.setHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String host, SSLSession sess) {
                        if (host.equals("localhost")) return true;
                        else return false;
                    }
                });

            con.setRequestProperty("Content-Type", "application/json");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setRequestMethod("PUT");
            PrintStream ps = null;
            ps = new PrintStream(con.getOutputStream());
            ps.print(aLoginJS);
            ps.close();

            //dump all the content
            StringBuffer string = null;
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            string = new StringBuffer();
            String inputLine = null;
            while ((inputLine = br.readLine()) != null) {
            string.append(inputLine);
            }

            response = string.toString();
            br.close();

         } catch (MalformedURLException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (NoSuchAlgorithmException e) {
             e.printStackTrace();
         } catch (KeyManagementException e) {
             e.printStackTrace();
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
            if (con != null) {
                con.disconnect();
            }
         }

         return response;

「java.net.UnknownHostException: example.org」が表示されます。例外:

java.net.UnknownHostException: example.org
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source)
at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)

ただし、この例外は常に発生するわけではなく、たまにしか発生しません。混乱している。

IPV4 と IPV6 を有効にして、Java バージョン 1.6 を実行しています。

両方が有効になっている場合、JVM はどの IP バージョンを使用しますか?

グーグルで調べてみると、JVM が IPV6 では正しく動作しないことがわかりました。

この例外は、IPV4 のみが有効な環境で発生しますか? 詳しく教えてください。

どんな助けでも大歓迎です。

前もって感謝します..

4

1 に答える 1

0

アプリを起動するときに、このパラメーターをコマンド ラインに追加します-Djava.net.preferIPv4Stack=true。目的は一目瞭然です。

于 2014-07-03T06:40:21.503 に答える