Android HTTPS 客户端不从套接字读取数据

Posted

技术标签:

【中文标题】Android HTTPS 客户端不从套接字读取数据【英文标题】:Android HTTPS Clientnot reading data from socket 【发布时间】:2012-09-11 17:53:01 【问题描述】:

我正在开发一个应用程序,它将从 C++ 服务器(目前在我的本地网络上)读取 SSL 加密的字符串数据,并以实物形式返回信息。

我学习了许多关于 bouncycastle 提供程序、自定义套接字工厂、http 客户端的教程和示例,并且我已经能够将信息从模拟器发送到我的 c++ 服务器,但是模拟器无法读取来自套接字的数据。相反,我得到:

java.net.SocketTimeoutException: 读取超时

服务器识别握手和连接,并读取模拟器写入的传入语句。

请求在 AsyncTask 线程中被调用

private class getXmlTask extends AsyncTask<String, String, String>  

    protected void onPreExecute() 
        pd = ProgressDialog.show(NewJobsView.this,"Retrieving Data","Please Wait",true,false);
        pd.setCancelable(true);

    
    protected void onPostExecute(String XML) 
        Log.i("XML:", XML);
        parseXml();
        pd.dismiss();
    

    @Override
    protected String doInBackground(String... params) 
        return getXml();
       

这是我正在使用的请求类(如果有点乱,请原谅):

public class HttpRequest

    MyHttpClient httpClient;
    HttpContext localContext;
    private String ret;

    HttpResponse response = null;
    HttpPost httpPost = null;
    HttpGet httpGet = null;
    Context context = null;   

    int retry = 0;



    public HttpRequest(Context c)
        HttpParams params = new BasicHttpParams();

        context = c;

        HttpConnectionParams.setConnectionTimeout(params, 60000);
        HttpConnectionParams.setSoTimeout(params, 60000);
        HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
        HttpProtocolParams.setUseExpectContinue(params, true);

        httpClient = new MyHttpClient(context);             

        params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);       


        httpClient.setParams(params);
        localContext = new BasicHttpContext();    
    


    public void abort() 
        try 
            if (httpClient != null) 
                System.out.println("Abort.");
                httpPost.abort();
            
         catch (Exception e) 
            System.out.println("MyApp" + e);
        
    

    public String sendPost(String url, String data) 
        return sendPost(url, data, null);
        

    public String sendPost(String url, String data, String contentType) 
        ret = null; 

        httpPost = new HttpPost(url);
        httpPost.addHeader("User-Agent", data);
        response = null;               

        StringEntity ent = null;        

        try 
            ent = new StringEntity(data,"UTF-8");
         catch (UnsupportedEncodingException e) 
            Log.e("MyApp", "HttpUtils : UnsupportedEncodingException : "+e);
        

        httpPost.setEntity(ent);

        try 

            response = httpClient.execute(httpPost);

            if (response != null) 
                ret = EntityUtils.toString(response.getEntity());
                Log.e("MyApp", "HttpUtils: " + ret);
            
            else
                abort();
            

         catch (Exception e) 
            Log.e("MyApp", "HttpUtils: " + e);
        

        Log.d("MyApp", "Returning value:" + ret);

        if(retry < 3)
            sendPost(url, data);
            retry = retry +1;
        
        else
            return ret;
        

        return ret;

      


其他几点说明:

我有

使用权限 android:name="android.permission.INTERNET"

在我的清单文件中。

我还验证了 SSL 服务器工作正常,因为其他客户端(尽管是 C++)能够保持连接并从套接字读取。

MyHttpClient 对象是

的近似副本

How to create a BKS (BouncyCastle) format Java Keystore that contains a client certificate chain

我已经旋转了很长时间,任何答案将不胜感激。

谢谢!

【问题讨论】:

... 和 url 地址是? 10.0.2.2 还是本地主机? 到目前为止,我发现模拟器将192.168.0.100(我的开发盒)和10.0.2.2视为同义词,所以我使用192.168.0.100 【参考方案1】:

首先检查您的网址,并建议尝试使用httpsconnection

它比普通的 httpGet 更好,因为它有时会给你 sockettime / ssl 或任何其他 io 异常

【讨论】:

以上是关于Android HTTPS 客户端不从套接字读取数据的主要内容,如果未能解决你的问题,请参考以下文章

读取时的套接字行为

在 android studio 中使用 AsyncTask 从套接字读取数据

从socket bufferreader永远读取android

IOException:读取失败,套接字可能关闭 - Android 4.3 上的蓝牙

Qt-udp通信

不从服务器上存在的 .txt 文件中读取文本[重复]