当前位置: 首页 > 知识库问答 >
问题:

在android应用程序中从http转换为https后出现SocketTimeoutException

严繁
2023-03-14

在尝试将我的Android应用程序转换为使用SSL在我的Android应用程序和Web服务器之间传输信息后,我遇到了一些问题。(套接字时间异常)

我从证书颁发机构 (CA) 购买了正 SSL 证书,并将我的服务器配置为正确使用它。我已经在我的Web浏览器中对其进行了测试,并且它工作正常。

现在我正在尝试修改我的android应用程序以使用https而不是超文本传输协议,但由于这是我自己第一次使用https,我有点困惑,我需要在java代码中实现哪些步骤。

目前,我正在我的设置页面上工作,我在其中配置我的应用程序以使用正确的url。例如,我在一个活动中有2个文本字段,我在其中输入网站url(http://www.mydomain.com)和相关页面存储在其中的应用程序文件夹(myappfile)。

然后,我使用以下代码连接并测试连接变量是否配置正确,其中validateurl.aspx是一个网页,如果该网页存在,它将返回一个JSON字符串:

protected boolean validateConnectionSettings() {        

    String result = "";
    boolean validated = false;
    try {
        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append(tvWebsiteURLValue.getText() + File.separator + tvApplicationMiddlewareValue.getText() + File.separator + "validateurl.aspx");
        URL url = new URL(urlBuilder.toString());
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
        url = uri.toURL();

        URLConnection urlConn = url.openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader(urlConn.getInputStream()));

        String inputLine;
        while((inputLine = in.readLine()) != null){
            result += inputLine;
        }                   
        in.close();

        if(result.equals("exists")) {
            validated = true;
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    }

    return validated;
}

现在,当我尝试转换(http://www.mydomain.com)变量来使用https我得到了上面提到的java.net.SocketTimeoutException。

我在谷歌上搜索了这个问题,发现我应该在上面的代码中实现HttpsURLConnection而不是URLConnection,因此我修改了我的代码,如下所示:

    protected boolean validateConnectionSettings() {        

    String result = "";
    boolean validated = false;
    try {
        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append(tvWebsiteURLValue.getText() + File.separator + tvApplicationMiddlewareValue.getText() + File.separator + "validateurl.aspx");
        URL url = new URL(urlBuilder.toString());
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
        url = uri.toURL();

        // URLConnection urlConn = url.openConnection();
        HttpsURLConnection urlConn = (HttpsURLConnection)url.openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader(urlConn.getInputStream()));

        String inputLine;
        while((inputLine = in.readLine()) != null){
            result += inputLine;
        }                   
        in.close();

        if(result.equals("exists")) {
            validated = true;
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    }

    return validated;
}

但是,我仍然收到 java.net.套接字超时异常。任何想法我做错了什么?

共有1个答案

束志业
2023-03-14

好的,我找到了导致SocketTimeOutException的问题。

问题似乎是我在家工作,手机使用的网络与服务器所在的网络相同。在这种情况下,它似乎无法使用https连接到服务器。我关闭了手机的无线网络,并使用手机3G连接进行连接,然后快速连接应用程序并验证我的URL。

我在网络浏览器中直接从服务器和我的工作笔记本电脑测试https连接时也遇到了类似的问题。在每种情况下,我都通过将www.mydomain.com地址添加到主机文件中来解决这个问题。

我现在要考虑编辑我的android手机主机文件,看看这是否会解决问题,因为我不想使用手机G3连接进行测试,因为我预计我会收到很多费用。。。

病在下面发布评论后再说它是怎么回事

我希望这能帮助其他有类似问题的人。

 类似资料:
  • 我在android studio中建立了一个转换器,当我每次按转换按钮时,距离部分(activity)就会崩溃。该应用程序说,特定的activity已经停止工作,该应用程序回到主要的activity。在android studio中没有显示任何错误,我想我的问题可能是在使用旋转器中的int pos,但我不确定。这是我最后要完成的元素。请帮帮忙。下面是Java,后面是XML。 和xml null

  • 问题内容: 最近,我一直在扭曲使用HTTP代理。经过反复试验,我想我终于可以正常工作了。我想知道的是,如果可能的话,如何扩展此代理以使其也能够处理HTTPS页面?到目前为止,这是我得到的: 如该代码所示,为了示例,我现在仅打印通过连接进行的操作。是否可以使用相同的类来处理HTTPS?如果没有,我应该如何实施这样的事情? 问题答案: 如果要通过HTTP代理连接到HTTPS网站,则需要使用HTTP动词

  • 我想在锁定屏幕时保持屏幕方向和应用程序。 null

  • 我已经配置并运行了基于Spring的REST应用程序,但现在我想将其转换为Spring-Boot。 我的应用程序在带有Hibernate提供程序的JPA数据源之上使用Spring-Data-JPA: 我的RESTendpoint使用SpringMVC实现,配置如下: 此外,我尝试从application类中丢弃@EnableAutoConfiguration注释,并手动将bean添加到上下文中,但

  • 我正在开发我的应用程序。一切都好,但我不知道为什么我得到了这个错误,当我试图运行的应用程序: 从错误建议我添加了在我的主要应用程序清单: 当我运行我的应用程序我得到了这个错误: 我在谷歌上搜索到了这篇文章。我没有使用androidX 这是我的项目依赖项: 和库依赖: 我发现这篇文章Anber提到 项目具有同一库的不同版本 但我认为我的项目库是一样的!!!