猿问

为什么输出流写入器不写入数据?

我对Android编程非常陌生,我对输出流编写器有问题。现在我正在研究简单的测试应用程序,以向服务器发送POST请求。服务器端有一个PHP应用程序,旨在将数据写入txt文件。当我运行我的Android应用程序时,它会通过代码并执行“最终”块中的命令。服务器确实写入 txt 文件,但它放置了空数据。

我也尝试过使用GET方法,并尝试检查请求数组。但不会发送任何数据。如果我从我的代码中删除输出流作家,我会得到相同的图片,所以它根本不起作用。我也尝试使用编码,结果相同。

我通过类似的问题做了:输出流编写器不写入 - 写入文件和问题是它的创建;

安卓,爪哇:HTTP POST请求 - 这里和其他一些问题被使用httpClient,现在已经被取消了。

HttpUrl连接得到输出流有倍数HttpUrl连接得到输出流有多倍 - 这里网络在主线程,但我的运行在另一个线程上;

安卓开机自检请求不起作用Java连接输出流编写器为空 - 建议使用读卡器接收输入流。我尝试过这个解决方案,但结果是一样的(没有发送数据)

我的安卓版本6.0.1。问题可能出在哪里?

package com.victoria.requester;


import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import java.io.*;

import java.net.*;

import android.widget.TextView;

import java.io.IOException;

import java.net.URL;

import java.net.HttpURLConnection;


public class MainActivity extends AppCompatActivity {


    public final static String EXTRA_MESSAGE = "EXTRA_MESSAGE";


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        thread.start();

    }


    Thread thread = new Thread(new Runnable() {


        @Override

        public void run() {

            String url = "http://192.168.56.226:90/wfile.php";

            String f_name = "123";

            HttpURLConnection httpCon = null;

            TextView textView = findViewById(R.id.textView);

            textView.setText("OK1!");


            try {

                textView.setText("OK2!");

                URL urlObj = new URL(url);

                httpCon = (HttpURLConnection) urlObj.openConnection();


                httpCon.setDoInput(true);

                httpCon.setDoOutput(true);

                //httpCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

                httpCon.setRequestProperty("Content-Type", "text/html");

                httpCon.setRequestMethod("POST");


慕斯709654
浏览 165回答 2
2回答

慕莱坞森

所以,我终于解决了我的问题,这实际上很复杂。首先,谢谢你,@Stephen C。当我在获取输出流()之后移动响应代码时,我的服务器开始接收请求。重要的是,如果不调用 getResponseCode,则不会发送数据。但第二个问题是字符串:字符串参数=“f_name”+f_name;由于我丢失了“=”,POST数组中元素的名称是“f_name123”,值为空))))这就是为什么我无法从$_POST[“f_name”)中获取数据的原因。另外,我想注意到,只有在连接内访问时,textview才起作用。断开连接后,您可以使用文本视图。感谢大家的帮助。下一个代码现在对我有用:package com.victoria.requester;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import java.io.*;import java.net.*;import android.widget.TextView;import java.io.IOException;import java.net.URL;import java.net.HttpURLConnection;public class MainActivity extends AppCompatActivity {    public final static String EXTRA_MESSAGE = "EXTRA_MESSAGE";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        thread.start();    }    Thread thread;    {        thread = new Thread(new Runnable() {            @Override            public void run() {                String url = "http://192.168.56.226:90/wfile.php";                String f_name = "123";                HttpURLConnection httpCon = null;                TextView textView = findViewById(R.id.textView);                try {                    URL urlObj = new URL(url);                    httpCon = (HttpURLConnection) urlObj.openConnection();                    httpCon.setDoOutput(true);                    httpCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");                    httpCon.setRequestMethod("POST");                    String parameters = "f_name=" + f_name;                    OutputStreamWriter writer = new  OutputStreamWriter(httpCon.getOutputStream());                    writer.write(parameters);                    writer.flush();                    writer.close();                    httpCon.getResponseCode();                 } catch (MalformedURLException e) {                    textView.setText("bad  URL!");                } catch (IOException e) {                    textView.setText("network error!");                } finally {                    httpCon.disconnect();                    textView.setText("All done");                }            }        });    }}

萧十郎

问题是您在调用 后调用并写入请求数据。httpCon.getOutputStream()httpCon.getResponseCode()正确的顺序是:调用以获取 URL 的连接对象getConnection()按任何顺序:设置请求方法设置任何请求属性调用,因为您打算使用输出流。setDoOutput(true)叫getOutputStream()写入数据。关闭流。获取响应代码。您当前正在执行的操作将在调用 时引发异常。远程服务器只有在读取请求数据后才能向您发送响应。当您调用它时,告诉客户端堆栈向服务器指示没有更多的请求数据。getOutputStreamgetResponseCode()此外,如果您不打算在某些情况下从连接中读取数据,则不应调用。至少它是多余的。setDoInput(true)
随时随地看视频慕课网APP

相关分类

Java
我要回答