【问题标题】:Connecting Android App to PHP Server Through JSON: Socket Exception通过 JSON 将 Android 应用程序连接到 PHP 服务器:Socket 异常
【发布时间】:2017-11-30 04:39:39
【问题描述】:

我正在尝试接收 JSON 对象并将内容放入 ArrayList。我们设置的 PHP 服务器显示应用程序正在联系服务器,但没有发回任何内容。 我没有收到任何致命错误,但我收到了 Socket Error: Permission Denied。

D/NetworkSecurityConfig: No Network Security Config specified, using platform default
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
W/System.err: java.net.SocketException: Permission denied
W/System.err:     at java.net.Socket.createImpl(Socket.java:454)
W/System.err:     at java.net.Socket.getImpl(Socket.java:517)
W/System.err:     at java.net.Socket.setSoTimeout(Socket.java:1108)
W/System.err:     at com.android.okhttp.Connection.connectSocket(Connection.java:1454)
W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:1413)
W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1707)
W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:133)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:466)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:371)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:503)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:438)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:247)
W/System.err:     at java.net.URLConnection.getContent(URLConnection.java:737)
W/System.err:     at com.example.steve.plantpals.receiveData.receivePlantList(receiveData.java:41)
W/System.err:     at com.example.steve.plantpals.UserActivity$1.onClick(UserActivity.java:38)
W/System.err:     at android.view.View.performClick(View.java:6205)
W/System.err:     at android.widget.TextView.performClick(TextView.java:11103)
W/System.err:     at android.view.View$PerformClick.run(View.java:23653)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:154)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6682)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
W/System.err: java.net.SocketException: Permission denied
W/System.err:     at java.net.Socket.createImpl(Socket.java:454)
W/System.err:     at java.net.Socket.getImpl(Socket.java:517)
W/System.err:     at java.net.Socket.setSoTimeout(Socket.java:1108)
W/System.err:     at com.android.okhttp.Connection.connectSocket(Connection.java:1454)
W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:1413)
W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1707)
W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:133)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:466)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:371)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:503)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:438)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:247)
W/System.err:     at java.net.URLConnection.getContent(URLConnection.java:737)
W/System.err:     at com.example.steve.plantpals.receiveData.receivePlantList(receiveData.java:41)
W/System.err:     at com.example.steve.plantpals.UserActivity$1.onClick(UserActivity.java:38)
W/System.err:     at android.view.View.performClick(View.java:6205)
W/System.err:     at android.widget.TextView.performClick(TextView.java:11103)
W/System.err:     at android.view.View$PerformClick.run(View.java:23653)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:154)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6682)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

这里是我调用接收数据的地方:

public class receiveData {
    int moisture = LocalStorage.moisture;
    User user;

    ArrayList<Plant> receivedPlants = new ArrayList<Plant>();

    URL url = new URL("http://192.168.0.14/steve.php");

   URLConnection urlConnection = (HttpURLConnection) url.openConnection();

    public receiveData() throws IOException {
    }


    public ArrayList<Plant> receivePlantList() {
        // HTTP request
        urlConnection.setDoOutput(true);

        try {
            urlConnection.getContent();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Get items from JSON object and place in a plant list
        BufferedReader reader = null;
        try {
            InputStream stream = urlConnection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));
            JsonReader jReader = new JsonReader(reader);

            jReader.beginObject();
            while (jReader.hasNext()) {
                jReader.nextName();
                int plantMoisture = jReader.nextInt();
                String plantName = jReader.nextString();
                Plant currentPlant = new Plant(plantName, plantMoisture);
                receivedPlants.add(currentPlant);
            }
            jReader.endObject();
            reader.close();
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //jReader.close();
        return receivedPlants;
    }

这是我的 Android 清单:

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


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.INTERNET" />

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MyPlants"
            android:label="@string/title_activity_my_plants"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity android:name=".AddPlant" />
        <activity android:name=".testMoistureHigh" />
        <activity android:name=".testMoistureLow" />
        <activity android:name=".testMoistureOptimal" />
        <activity
            android:name=".SettingsActivity"
            android:label="@string/title_activity_settings" />
        <activity android:name=".UserActivity"></activity>
    </application>

</manifest>

这是我第一个需要联网的项目,也是我的第一个 stackoverflow 问题,如果不清楚,请见谅。

【问题讨论】:

  • Manifest 中是否添加了 Internet 权限?
  • 在下面查看我的答案

标签: java php android json networking


【解决方案1】:

你必须在你的应用标签之外声明你的权限

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

   <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    ...

【讨论】:

  • 谢谢,我之前尝试过,但它给了我另一个错误。我再次收到该错误:E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.steve.plantpals, PID: 31260 android.os.NetworkOnMainThreadException
  • 是的,这是另一个错误,因为您在主线程中进行长时间操作,您必须使用 AsyncTask、Threads、Loaders 等后台线程。但是您在问题中描述的问题已通过我的解决方案解决,因此您可以将其标记为已接受的答案并写下另一个问题。 :)
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多