Java 调用HttpsURLConnection.getCipherSuite()时出错

Java 调用HttpsURLConnection.getCipherSuite()时出错,java,ssl,https,Java,Ssl,Https,我正在尝试运行一个示例程序,该程序调用getCipherSuite()失败,出现java.lang.IllegalStateException:connection not open异常。连接已打开,因此不确定发生这种情况的原因。我使用的是java版本1.6.0_18 有人知道为什么会有例外吗 谢谢 package web.services.https; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import j

我正在尝试运行一个示例程序,该程序调用
getCipherSuite()
失败,出现
java.lang.IllegalStateException:connection not open异常
。连接已打开,因此不确定发生这种情况的原因。我使用的是java版本1.6.0_18

有人知道为什么会有例外吗

谢谢

package web.services.https;

import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import java.net.MalformedURLException;
import java.security.cert.Certificate;
import java.io.IOException;

public class SunClient {

  private static final String url_s = "https://java.sun.com:443";

  public static void main(String[] args) {
    new SunClient().do_it();
  }

  private void do_it() {

    try {
        URL url = new URL(url_s);
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setDoInput(true);
        conn.setRequestMethod("GET");
        conn.connect();

        System.out.println("\nConnected ...\n");

        dump_features(conn);
    }

    catch(MalformedURLException e) {
        System.err.println("MalformedURLException exception: " + e);
    }

    catch(IOException e) {
        System.err.println("IOException exception: " + e);
    }

  }

  private void dump_features(HttpsURLConnection conn) {

    try {

        Certificate[] certs = conn.getServerCertificates();

        for(Certificate cert: certs) {
            print("\tCert. type: " + cert.getType());
            print("\tHash code: " + cert.hashCode());
            print("\tAlgorithm: " + cert.getPublicKey().getAlgorithm());
            print("\tFormat: " + cert.getPublicKey().getFormat());
            print("");
        }

        print("Status code: " + conn.getResponseCode());
        print("Cipher suite: " + conn.getCipherSuite());

    }

    catch(Exception e) {
        System.err.println("Exception exception: " + e);
    }

  }

  private void print(String s) {
    System.out.println(s);
  }

}

它的发生正是因为例外中所述的原因。你是在cnnextion打开之前呼叫它的。解决方案:在调用getInputStream()、getResponseCode()等之后调用它。

在getResponseCode()之后调用它。就在那件事之后,我直接给它打电话。我得到的回复代码是302。我建议你发布更多的代码。到目前为止,您发布的内容没有显示任何这些内容。对getResponseCode的调用包含在dump_features方法中(向下滚动);它被包装在对print方法的调用中,即(print(“状态代码:+conn.getResponseCode());)然后我以相同的方式在下一行调用getCipherSuite。我尝试了一个不同的url(即),它成功了。它返回的响应代码与302相同,但对conn.getCipherSuite()的调用有效。有人知道为什么会这样吗?@Paul I在获取不返回任何实体的端点时遇到了同样的问题(204)。测试URL()也不会返回任何正文,因此我猜测,当响应为空时,公共线程是处于奇怪状态的连接。