Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android openConnection()立即连接_Android_Httpurlconnection - Fatal编程技术网

Android openConnection()立即连接

Android openConnection()立即连接,android,httpurlconnection,Android,Httpurlconnection,由于Android从SDK中删除了ApacheWeb客户端(自6.0以来),我不希望在apk中包含该库,因此我将迁移到HttpURLConnection方法 为了进行测试,我在本地服务器上创建了一个testPost.php,它除了向数据库中添加一个日志条目外,什么都不做,大致如下所示: <?php require_once(__DIR__ . '/db_interface.php'); $conn = connectToDatabase(); $stmt = $conn->

由于Android从SDK中删除了ApacheWeb客户端(自6.0以来),我不希望在apk中包含该库,因此我将迁移到HttpURLConnection方法

为了进行测试,我在本地服务器上创建了一个testPost.php,它除了向数据库中添加一个日志条目外,什么都不做,大致如下所示:

<?php
  require_once(__DIR__ . '/db_interface.php');
  $conn = connectToDatabase();
  $stmt = $conn->prepare('insert into logs(data) values (?)');
  $stmt->bind_param(1, $_POST['data']);
  $stmt->execute();
  $stmt->close();
我得到异常,就好像我一打开连接它就连接了一样。 调试后,我注意到只要我跨过
url.openConnection()
,脚本就会执行,日志条目就会保存到数据库中(带有空字符串)

用于将数据发布到我的服务器的完整android代码:

        HttpURLConnection connection = null;
        try {
            URL url = new URL("http://192.168.2.221/testPost.php");

            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true); //throws IllegalStateException: Already Connected


            if ( timeout > 0 ) {
                connection.setReadTimeout(timeout * 1000);
                connection.setConnectTimeout(timeout * 1000);
            }

            String postString = writePostParams(params);
            byte[] postData = postString.getBytes("UTF-8");
            connection.setFixedLengthStreamingMode(postData.length);

            OutputStream out = new BufferedOutputStream(connection.getOutputStream());
            out.write(postData);
            out.flush();
            out.close();

            InputStream in = new BufferedInputStream(connection.getInputStream());
            String response = Util.readInputStream(in);

        } catch ( Exception ex ) {
            Debug.log(ex);
        } finally {
            if ( connection != null ) connection.disconnect();
        }
我正在测试运行安卓6.0.1的三星Galaxy S7

添加:在运行Android 5.0.2的模拟器上也进行了尝试,结果相同

异常堆栈跟踪:

07-08 10:39:30.141 23498-23875/? W/System.err: java.lang.IllegalStateException: Already connected
07-08 10:39:30.141 23498-23875/? W/System.err:     at java.net.URLConnection.checkNotConnected(URLConnection.java:463)
07-08 10:39:30.141 23498-23875/? W/System.err:     at java.net.URLConnection.setDoOutput(URLConnection.java:877)
07-08 10:39:30.141 23498-23875/? W/System.err:     at com.package.from.my.app.executeURL(Server.java:1195)  (the line where setDoOutput() is)
已解决
这可能会成为我个人的名人堂,因为我做了一些愚蠢的事情。 我的调试器将一个手表设置为
connection.getResponseMessage()
,当我跨过
openConnection()
行时,它得到了评估,从而打开和关闭了我的连接


感谢您的努力,希望这能为其他人节省一个小时的调试时间。

事实上,您的代码看起来不错,即使在文档中,它们的实现方式与您在下面的链接中搜索“发布内容”的方式相同,但唯一缺少的是您希望如何发送数据。他们正在使用chunks urlConnection.setChunkedStreamingMode(0)
让我用我的服务器测试他们的方法,并检查是否得到相同的精度

我测试了这段代码,它运行良好,我没有得到那个异常

public void testURL() {

        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL("http://www.android.com/");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setChunkedStreamingMode(0);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            urlConnection.disconnect();
        }
    }

这可能是某种服务器安全问题

你能发布例外情况吗log@VivekMishra补充。。检查此链接以正确实现开放连接。另外,
doInput
隐式地将请求类型设置为post,如果您不需要它,您可以删除该行。我不使用doInput,而且我很确定您的意思是
setDoOutput
(如果我没记错的话,就是将请求设置为post的)。此外,将我的代码与该问题中的公认答案(POST请求代码)进行比较,结果几乎相同(
url.openConnection
,后跟
setDoOutput
)。我将在一个运行早期版本android的模拟器上进行测试,看看它是否是这个设备上的一个bug。当我读到你的解决方案时,我想,“哇,谁会这么做?”然后我意识到我做了完全相同的事。你解决了我的问题,你并不孤单!有趣的是,我还尝试将我的数据发布到
https://posttestserver.com/post.php
,同样的例外。我可以尝试使用分块流模式,但我看不出有什么区别,因为在抛出异常之前,我的代码甚至没有到达那一行。我将尝试在不同的模拟器实例上运行它。你可以给我发送设备规格。
public void testURL() {

        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL("http://www.android.com/");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setChunkedStreamingMode(0);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            urlConnection.disconnect();
        }
    }