繁体   English   中英

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

[英]Android HTTPS Clientnot reading data from socket

我正在开发一个应用程序,它将从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对象是的近似副本

如何创建包含客户端证书链的BKS(BouncyCastle)格式的Java密钥库

我一直在转动我的车轮很长一段时间,任何答案将不胜感激。

谢谢!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM