HttpURLConnection connect() 将不起作用
HttpURLConnection connect() won't work
我尝试在我的 PC 上连接 php,但 Android 代码将停止在 con.connect()
我不知道这是怎么回事。
public String doInBackground(Void... arg0){
HttpURLConnection con = null;
String urlString = "http://localhost:8081/PHP/Android_SQL.php";
System.out.println("before try");
String res = "";
try {
URL url = new URL(urlString);
con = (HttpURLConnection) url.openConnection();
con.setReadTimeout(15000);
con.setConnectTimeout(10000);
con.setRequestMethod("GET");
//set input and output descript
con.setDoInput(true);
con.setDoOutput(false); // in needed?
System.out.println("connecting");
con.connect(); // won't work
System.out.println("connect ");
System.out.println(con.getURL());
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
sb.append(line + "\n");
System.out.println(line);
}
json = sb.toString();
br.close();
return json;
}catch (SocketTimeoutException a){
a.getMessage();
}catch (IOException b){
b.getMessage();
}catch (Exception e) {
e.getMessage();
}
finally {
System.out.println("sueecssful");
}
return null;
}
我发现问题之一是 SSL 认证?
logcat:
05-24 20:27:44.032 3089-3089/com.example.user.tophp I/System.out: click the button
05-24 20:27:44.033 3089-3237/com.example.user.tophp I/System.out: before try
05-24 20:27:44.033 1524-1595/system_process W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client
05-24 20:27:44.033 3089-3237/com.example.user.tophp I/System.out: connecting
05-24 20:27:44.036 3089-3237/com.example.user.tophp I/System.out: sueecssful
您正在尝试连接到 localhost:8081
,它本身就是 Android 设备。
使用 adb
通过 USB 将 forward/reverse 端口连接到您的计算机,或者您可以简单地将 localhost
替换为计算机在本地网络上的 IP 。示例:192.168.0.2:8081
- adb forward remote port to local machine
- https://developer.android.com/studio/command-line/adb.html#forwardports
其他潜在问题:
catch (SocketTimeoutException a){
a.getMessage();
}catch (IOException b){
b.getMessage();
}catch (Exception e) {
e.getMessage();
}
至少将 a.getMessage();
替换为 a.printStackTrace()
以打印错误。但实际上你应该使用 Log.e("MyTag", "Error", a);
* https://developer.android.com/reference/android/util/Log.html
catch (SocketTimeoutException a){
Log.e("MyTag", "Timout Error", a);
}catch (IOException b){
Log.e("MyTag", "IO Error", b);
}catch (Exception e) {
Log.e("MyTag", "Error", e);
}
还要确保将以下内容添加到您的清单中 <uses-permission android:name="android.permission.INTERNET"/>
我尝试在我的 PC 上连接 php,但 Android 代码将停止在 con.connect()
我不知道这是怎么回事。
public String doInBackground(Void... arg0){
HttpURLConnection con = null;
String urlString = "http://localhost:8081/PHP/Android_SQL.php";
System.out.println("before try");
String res = "";
try {
URL url = new URL(urlString);
con = (HttpURLConnection) url.openConnection();
con.setReadTimeout(15000);
con.setConnectTimeout(10000);
con.setRequestMethod("GET");
//set input and output descript
con.setDoInput(true);
con.setDoOutput(false); // in needed?
System.out.println("connecting");
con.connect(); // won't work
System.out.println("connect ");
System.out.println(con.getURL());
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
sb.append(line + "\n");
System.out.println(line);
}
json = sb.toString();
br.close();
return json;
}catch (SocketTimeoutException a){
a.getMessage();
}catch (IOException b){
b.getMessage();
}catch (Exception e) {
e.getMessage();
}
finally {
System.out.println("sueecssful");
}
return null;
}
我发现问题之一是 SSL 认证?
logcat:
05-24 20:27:44.032 3089-3089/com.example.user.tophp I/System.out: click the button
05-24 20:27:44.033 3089-3237/com.example.user.tophp I/System.out: before try
05-24 20:27:44.033 1524-1595/system_process W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client
05-24 20:27:44.033 3089-3237/com.example.user.tophp I/System.out: connecting
05-24 20:27:44.036 3089-3237/com.example.user.tophp I/System.out: sueecssful
您正在尝试连接到 localhost:8081
,它本身就是 Android 设备。
使用 adb
通过 USB 将 forward/reverse 端口连接到您的计算机,或者您可以简单地将 localhost
替换为计算机在本地网络上的 IP 。示例:192.168.0.2:8081
- adb forward remote port to local machine
- https://developer.android.com/studio/command-line/adb.html#forwardports
其他潜在问题:
catch (SocketTimeoutException a){
a.getMessage();
}catch (IOException b){
b.getMessage();
}catch (Exception e) {
e.getMessage();
}
至少将 a.getMessage();
替换为 a.printStackTrace()
以打印错误。但实际上你应该使用 Log.e("MyTag", "Error", a);
* https://developer.android.com/reference/android/util/Log.html
catch (SocketTimeoutException a){
Log.e("MyTag", "Timout Error", a);
}catch (IOException b){
Log.e("MyTag", "IO Error", b);
}catch (Exception e) {
Log.e("MyTag", "Error", e);
}
还要确保将以下内容添加到您的清单中 <uses-permission android:name="android.permission.INTERNET"/>