这是我在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)
无法连接到本地主机。我无法解决问题。
请帮帮我。
答案 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();
}