-2

This is my code in java:

Button conect = (Button) findViewById(R.id.btconect);
    conect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String userAgent = "Mozilla/5.0";
            String address = "http://192.168.20.110:8080/Proteos/http.php";
            String forSending = "Batman";
            String charset = "UTF-8";

            try {
                URL URL = new URL(address);
                HttpURLConnection connection = (HttpURLConnection)URL.openConnection();
                connection.setRequestProperty("User-Agent", userAgent);
                String stringToSend = URLEncoder.encode(forSending, charset);
                //Para poder escribir datos a la URL
                connection.setDoOutput(true);
                connection.setDoInput(true);

                // Indicamos el tipo de request, POST en este caso
                connection.setRequestMethod("POST");

                // Indicamos un timeout de 10 segundos
                connection.setReadTimeout(10*1000);

                OutputStreamWriter out = new OutputStreamWriter(
                        connection.getOutputStream());
                out.write("nombre=" + stringToSend);
                out.close();

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                                connection.getInputStream()));
                String response;
                while((response = in.readLine()) != null)
                    System.out.println(response);
                in.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

My manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bmprietoc.httpconect">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

I've tried to make useful the code but i can´t get the failure. The application stop always right in here:

OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());

I change my code but the result is the same

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.
                Builder().permitNetwork().build());

        Button conect = (Button) findViewById(R.id.btconect);
        conect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new connection().execute();

            }
        });

    }

    private class connection extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {
            String userAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0";
            String address = "http://localhost/form.php";
            String forSending = "Batman";
            String charset = "UTF-8";

            // El metodo encode() de URLEncoder se encarga de encodear la cadena que enviaremos
            // al servidor, sustituyendo espacios y caracteres especiales
            String stringToSend = null;
            try {
                stringToSend = URLEncoder.encode(forSending, charset);
                // 1. Creamos objeto URL
                URL URL = new URL(address);
                // 2. Obtenemos el objeto URLConnection llamando a openConnection() en URL
                URLConnection connection = URL.openConnection();
                // Establecemos algunas propiedas de envió, como es el User-Agent
                connection.addRequestProperty("User-Agent", System.getProperty("http.agent"));

                // 3. Esto es importantisímo, es aqui donde establecemos la capacidad de envió.
                connection.setDoOutput(true);

                // 4. Abrimos una conexión al recurso para poder escribir/enviar datos al formulario
                // Nota que no se llama explícitamente a connect() porque llamados a getOutputStream()
                OutputStreamWriter out = new OutputStreamWriter(
                        connection.getOutputStream());
                out.write("nombre=" + stringToSend); // "nombre" es el campo del formulario web
                out.close();

                // Aquí leemos el resultado que nos devolvió el servidor, en efecto, lo que
                // respondió form.php y luego de enviar los datos
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                                connection.getInputStream()));
                String response;
                while ((response = in.readLine()) != null)
                    System.out.println(response);
                in.close();

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

    }
}

I change my code again like this.

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.
            Builder().permitNetwork().build());

    Button conect = (Button) findViewById(R.id.btconect);
    conect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new connection().execute();

        }
    });

}

private class connection extends AsyncTask <Void,Void,String> {

    @Override
    protected String doInBackground(Void... voids) {
        String userAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0";
        String address = "http://10.0.2.2/Proteos/http.php";
        String forSending = "Batman";
        String charset = "UTF-8";

        // El metodo encode() de URLEncoder se encarga de encodear la cadena que enviaremos
        // al servidor, sustituyendo espacios y caracteres especiales
        String stringToSend = null;
        try {
            stringToSend = URLEncoder.encode(forSending, charset);
            // 1. Creamos objeto URL
            URL URL = new URL(address);
            // 2. Obtenemos el objeto URLConnection llamando a openConnection() en URL
            URLConnection connection = URL.openConnection();
            // Establecemos algunas propiedas de envió, como es el User-Agent
            connection.addRequestProperty("User-Agent", userAgent);

            //System.getProperty("http.agent")

            // 3. Esto es importantisímo, es aqui donde establecemos la capacidad de envió.
            connection.setDoOutput(true);
            //connection.setConnectTimeout(50000);

            // 4. Abrimos una conexión al recurso para poder escribir/enviar datos al formulario
            // Nota que no se llama explícitamente a connect() porque llamados a getOutputStream()
            OutputStreamWriter out = new OutputStreamWriter(
                    connection.getOutputStream());
            out.write("nombre=" + stringToSend); // "nombre" es el campo del formulario web
            out.close();

            // Aquí leemos el resultado que nos devolvió el servidor, en efecto, lo que
            // respondió form.php y luego de enviar los datos
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            connection.getInputStream()));
            String response;
            while ((response = in.readLine()) != null)
                System.out.println(response);
            in.close();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

}

And the logcat is

09-20 18:23:31.887 1465-1675/com.example.bmprietoc.httpconect W/System.err: java.net.ConnectException: failed to connect to /10.0.2.2 (port 80): connect failed: ETIMEDOUT (Connection timed out)

It can't connect to the local host. I cant figure the problem out.

Please help me.

  • 1
    Possible duplicate of [How to fix android.os.NetworkOnMainThreadException?](http://stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception) – Daniel Nugent Sep 19 '16 at 21:19
  • Community hates to play hide-n-seek with code. Please always post LogCat, in addition to minimal code. And yes, this question is a duplicate of that question. – Sufian Sep 20 '16 at 09:54

2 Answers2

1

The code below work fine for me.

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.
            Builder().permitNetwork().build());

    Button conect = (Button) findViewById(R.id.button);
    conect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new connection().execute();

        }
    });

}

private class connection extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        String userAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0";
        String address = "http://private-a1505-mmcapi.apiary-mock.com/notes/id";
        String forSending = "Batman";
        String charset = "UTF-8";

        // El metodo encode() de URLEncoder se encarga de encodear la cadena que enviaremos
        // al servidor, sustituyendo espacios y caracteres especiales
        String stringToSend = null;
        try {
            stringToSend = URLEncoder.encode(forSending, charset);
            // 1. Creamos objeto URL
            URL URL = new URL(address);
            // 2. Obtenemos el objeto URLConnection llamando a openConnection() en URL
            URLConnection connection = URL.openConnection();
            // Establecemos algunas propiedas de envió, como es el User-Agent
            connection.addRequestProperty("User-Agent", System.getProperty("http.agent"));

            // 3. Esto es importantisímo, es aqui donde establecemos la capacidad de envió.
            connection.setDoOutput(true);

            // 4. Abrimos una conexión al recurso para poder escribir/enviar datos al formulario
            // Nota que no se llama explícitamente a connect() porque llamados a getOutputStream()
            OutputStreamWriter out = new OutputStreamWriter(
                    connection.getOutputStream());
            out.write("nombre=" + stringToSend); // "nombre" es el campo del formulario web
            out.close();

            // Aquí leemos el resultado que nos devolvió el servidor, en efecto, lo que
            // respondió form.php y luego de enviar los datos
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            connection.getInputStream()));
            String response;
            while ((response = in.readLine()) != null)
                System.out.println(response);
            in.close();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}
}
skryshtafovych
  • 572
  • 4
  • 16
0

I'm getting a NetworkOnMainThreadException when I run your code. You will have to create an AsyncTask to perform this operation.

An AsyncTask with your logic might look something like this (although you will need to change the parameters in the <Void, Void, Void> field if you wish to change your input and return parameters.

private class NetTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {
        String userAgent = "Mozilla/5.0";
        String address = "http://192.168.20.110:8080/Proteos/http.php";
        String forSending = "Batman";
        String charset = "UTF-8";

        try {
            URL URL = new URL(address);
            HttpURLConnection connection = (HttpURLConnection)URL.openConnection();
            connection.setRequestProperty("User-Agent", userAgent);
            String stringToSend = URLEncoder.encode(forSending, charset);
            //Para poder escribir datos a la URL
            connection.setDoOutput(true);
            connection.setDoInput(true);

            // Indicamos el tipo de request, POST en este caso
            connection.setRequestMethod("POST");

            // Indicamos un timeout de 10 segundos
            connection.setReadTimeout(10*1000);

            OutputStreamWriter out = new OutputStreamWriter(
                    connection.getOutputStream());
            out.write("nombre=" + stringToSend);
            out.close();

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            connection.getInputStream()));
            String response;
            while((response = in.readLine()) != null)
                System.out.println(response);
            in.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

Then just execute the asyncTask in your onClick like this:

public void onClick(View v) {
    new NetTask().execute();
}
Weava
  • 496
  • 2
  • 13