无法将网址与HttpUrlconnect

时间:2016-09-19 20:38:46

标签: android

这是我在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();
            }

我的清单

<?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>

我试图使代码变得有用,但我无法得到失败。应用程序始终在此处停止:

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

我更改了我的代码,但结果是相同的

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;
        }

    }
}

我再次改变我的代码。

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;
    }
}

}

logcat是

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)

无法连接到本地主机。我无法解决问题。

请帮帮我。

2 个答案:

答案 0 :(得分:1)

以下代码对我来说很好。

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;
    }

}
}

答案 1 :(得分:0)

我运行代码时收到NetworkOnMainThreadException。您必须创建一个AsyncTask来执行此操作。

使用逻辑的AsyncTask可能看起来像这样(如果您希望更改输入和返回参数,则需要更改<Void, Void, Void>字段中的参数。

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;
    }

然后只需执行onClick中的asyncTask:

public void onClick(View v) {
    new NetTask().execute();
}
相关问题