2

https url 接続を使用して json コンテンツを url に投稿していますが、応答も取得しています。しかし残念なのは、電話の応答時間が約2分であることです。同じものを分析したところ、サーバーに初めて接続するときにレイテンシが発生することがわかりました。これが私が使用しているコードスニペットです。誰かがこれの何が悪いのか教えてもらえますか?

import java.net.*;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.io.*;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

import org.apache.axis2.java.security.TrustAllTrustManager;
import org.json.JSONObject;

public class httpsurl implements X509TrustManager {



public static void main(String s[]) throws ProtocolException {
    httpsurl.query("https://instance.service-now.com/incident.do?JSON");

}

public static void query(String URLName) {
    HttpsURLConnection con = null;
    try {

        JSONObject json = new JSONObject();
        json.put("parameter 1", "value 1");
        json.put("parameter 2", "value 2");



        sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
                "proxy name", 8080));
        String encodedUserPwd = encoder
                .encode("username:password".getBytes());
          URL u = new URL(URLName);
  //            System.setProperty("http.keepAlive", "false");

        con = (HttpsURLConnection) u.openConnection(proxy);
        SSLContext mySsl = SSLContext.getInstance("TLS");
         mySsl.init(null, new TrustManager[]{new TrustAllTrustManager()}, null);
        con.setRequestProperty("connection", "close");
        con.setReadTimeout(10000);
         con.setConnectTimeout(15000);
        con.setRequestMethod("POST");
         con.setDoInput(true);
        con.setDoOutput(true);
        con.addRequestProperty("Content-Type",  "application/json");
        con.setRequestProperty("Authorization", "Basic " + encodedUserPwd);
         con.setUseCaches(false);
        con.setSSLSocketFactory(mySsl.getSocketFactory());

//          con.connect();          

        OutputStream os = con.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                os, "UTF-8"));
        writer.write(json.toString());
          writer.flush();
        writer.close();
        os.close();



         // Get response
        int HttpsResult = con.getResponseCode();
        StringBuffer sb = new StringBuffer();
        if (HttpsResult == HttpsURLConnection.HTTP_OK) {
             BufferedReader br = new BufferedReader(new InputStreamReader(
                     con.getInputStream(), "utf-8"));
             String line = null;

             while ((line = br.readLine()) != null) {
                 sb.append(line + "\n");
             }
            br.close();

            System.out.println("" + sb.toString());
        } else {
            System.out.println(con.getResponseMessage());
        }




     } catch (MalformedURLException e) {

        e.printStackTrace();
    } catch (IOException e) {

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

        }
    }
}

@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
        throws CertificateException {
    // TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
        throws CertificateException {
    // TODO Auto-generated method stub

}

@Override
public X509Certificate[] getAcceptedIssuers() {
    // TODO Auto-generated method stub
    return null;
}

}

前もって感謝します、

ディーパック

4

1 に答える 1

2

複数のことが間違っている可能性があります。これ以上トラブルシューティングを行わないと、なんとも言えません...私の経験では、次のいずれかになります。

  1. サーバー側の問題 (呼び出しに非常に時間がかかる) -- http/https を実行したかどうかに関係なく、応答速度が遅くなります (https は少し遅くなります)。
  2. DNS ルックアップ時間 (これは http/https の両方に影響します)。
  3. ファイアウォールの問題 (たとえば、DNS 要求を実行している、またはホスト名に複数の A レコードがあり、一部がブロックされている)。
  4. 安全であるとマークされたリクエスト/レスポンスで Cookie が送信されており、サーバーに適切なエントロピー ソースがありません (例: http://theheat.dk/blog/?p=1539 )
  5. を使用していることがわかりますTrustAllManager。過去に、私はそのようなことで問題を抱えていました。自己署名証明書を信頼ストアにインポートすることをお勧めします。うまくいくようです。(その方法の例については、http://www.chrissearle.org/2007/10/25/Adding_self-signed_https_certificates_to_java_keystore/を参照してください)。

これを診断するための最善の策は、Wireshark です。コードが con.getOutputStream() を実行した直後にネットワーク接続を開始し、SYn/SYNC+ACK/ACK がすぐに発生することを、wireshark/tcpdump を使用して示すことができれば、サーバーに指を向けることができます。

幸運を!

于 2014-08-04T14:12:40.310 に答える