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