为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2022-09-14 10:25:28
我对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");
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

所以,我终于解决了我的问题,这实际上很复杂。首先,谢谢你,@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");



                }

            }

        });

    }


}


查看完整回答
反对 回复 2022-09-14
?
萧十郎

TA贡献1815条经验 获得超13个赞

问题是您在调用 调用并写入请求数据。httpCon.getOutputStream()httpCon.getResponseCode()

正确的顺序是:

  1. 调用以获取 URL 的连接对象getConnection()

  2. 按任何顺序:

    • 设置请求方法

    • 设置任何请求属性

    • 调用,因为您打算使用输出流。setDoOutput(true)

  3. getOutputStream()

  4. 写入数据。

  5. 关闭流。

  6. 获取响应代码。

您当前正在执行的操作将在调用 时引发异常。远程服务器只有在读取请求数据才能向您发送响应。当您调用它时,告诉客户端堆栈向服务器指示没有更多的请求数据。getOutputStreamgetResponseCode()

此外,如果您不打算在某些情况下从连接中读取数据,则不应调用。至少它是多余的。setDoInput(true)


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号