2011-10-11 91 views
2

我的代码适用于http,但不适用于https。以下是错误消息,即时得到我的呼唤的getMessage()IOException异常通过https获取XML数据://

java.net.SocketException异常:地址家族不受协议

支持我的继承人代码:

package com.evankimia; 

import java.io.IOException; 
import java.io.StringReader; 
import java.io.UnsupportedEncodingException; 
import java.net.MalformedURLException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.HttpVersion; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.conn.ClientConnectionManager; 
import org.apache.http.conn.scheme.PlainSocketFactory; 
import org.apache.http.conn.scheme.Scheme; 
import org.apache.http.conn.scheme.SchemeRegistry; 
import org.apache.http.conn.ssl.SSLSocketFactory; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpParams; 
import org.apache.http.params.HttpProtocolParams; 
import org.apache.http.protocol.HTTP; 
import org.apache.http.util.EntityUtils; 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class XMLParserTestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  
    { 
     Log.e("sys",""+getXML()); 

    } 
} 

    public String getXML(){ 
     String line = null; 

     try { 

      DefaultHttpClient httpClient = this.createHttpClient(); 
      HttpPost httpPost = new HttpPost("https://web2.uconn.edu/driver/old/timepoints.php?stopid=10"); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      line = EntityUtils.toString(httpEntity); 

     } catch (UnsupportedEncodingException e) { 
      line = "<results status=\"error\"><msg>Cans't connect to server</msg></results>"; 
     } catch (MalformedURLException e) { 
      line = "<results status=\"error\"><msg>Cand't connect to server</msg></results>"; 
     } catch (IOException e) { 
      line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
      e.getMessage(); 
     } 

     return line; 

} 

private DefaultHttpClient createHttpClient() 
{ 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); 
    HttpProtocolParams.setUseExpectContinue(params, true); 

    SchemeRegistry schReg = new SchemeRegistry(); 
    schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 
    ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); 

    return new DefaultHttpClient(conMgr, params); 
} 

} 

回答

0

您列出的方法仅适用于http。让你的程序识别https url并使用下面的一些字母。

/** 
* Initialize the HTTP/S connection (if needed) 
* 
* @param keystoreFile the full path of the keystore file 
* @param keystorePass the password for the keystore file 
*/ 
private void initHttps(String keystoreFile, String keystorePass) 
{ 
    // check if the URL uses HTTP/S 
    if (url.toLowerCase().startsWith(HTTPS_PROTOCOL)) 
    { 
     print("Initializing HTTP/S protocol..."); 
     // set the system properties needed for HTTP/S 
     System.setProperty("javax.net.ssl.keyStore", keystoreFile); 
     System.setProperty("javax.net.ssl.keyStorePassword", keystorePass); 
     System.setProperty("javax.net.ssl.keyStoreType", "JKS"); 
     System.setProperty("javax.net.ssl.trustStore", keystoreFile); 
     System.setProperty("javax.net.ssl.trustStorePassword", keystorePass); 
     System.setProperty("javax.protocol.handler.pkgs", 
      "com.sun.net.ssl.internal.www.protocol"); 
     //int addProvider = Security.addProvider(new  com.sun.net.ssl.internal.ssl.Provider()); 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() 
     { // fix a HTTP/S handshake issue 
      public boolean verify(String hostName, SSLSession session) 
      { // Verify that the host name is acceptable 
       return true; 
      } 
     }); 
    } 
}