java.net.SocketException: Socket fehlgeschlagen: EPERM (Operation nicht erlaubt)

142

Ich arbeite an einem Android Studio-Projekt mit mehreren Aktivitäten. Ich versuche derzeit, die Ausgabe eines Java-Servlets auf localhost zu lesen, aber es scheint aufgrund einer Socket-Berechtigung abzustürzen.

Ich habe ein neues Projekt erstellt, genau den gleichen Code verwendet und perfekt funktioniert. Ich verstehe also nicht, warum ich nicht bereit bin, an meinem Projekt zu arbeiten.

public class LoginActivity extends AppCompatActivity {


String apiUrl = "http://10.0.2.2:8080/ProyectService/Servlet?action=login";
EditText username;
EditText password;
AlertDialog dialog;
Usuario session;

@Override
public void onCreate(Bundle savedInstanceState) {
    // Inicializacion de ventana
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    getSupportActionBar().hide();

    // Inicializacion de componentes
    username = findViewById(R.id.username);
    password = findViewById(R.id.password);

    // Inicializacion de funcionalidad de botones
    Button button= (Button) findViewById(R.id.login);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            UserLoginTask mAuthTask = new UserLoginTask();
            mAuthTask.execute();
        }
    });

    password = findViewById(R.id.password);
    createAlertDialog("Usuario o Contraseña Incorrectos");
    }

    private void createAlertDialog(String message){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(message)
            .setTitle("Error");
    dialog = builder.create();
    }



    // ASYNCRONUS NETWORK PROCESS

    public class UserLoginTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
    }


    @Override
    protected String doInBackground(String... params) {

        // implement API in background and store the response in current variable
        String current = "";
        try {
            URL url;
            HttpURLConnection urlConnection = null;
            try {
                url = new URL(apiUrl);
                System.out.println(apiUrl);
                urlConnection = (HttpURLConnection) url
                        .openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader isw = new InputStreamReader(in);

                int data = isw.read();
                while (data != -1) {
                    current += (char) data;
                    data = isw.read();
                    //System.out.print(current);

                }
                System.out.print(current);
                // return the data to onPostExecute method
                return current;

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            return "Exception: " + e.getMessage();
        }
        return current;
        }
    }

    protected void onPostExecute(String success) {
        Log.i(success, "");
       //attemptLogin();
    }
}

Ich erwarte, dass es die Daten liest, aber es stürzt in dieser Zeile ab:

InputStream in = urlConnection.getInputStream();

Dies ist die Fehlerausgabe:

java.net.SocketException: socket failed: EPERM (Operation not permitted)
at java.net.Socket.createImpl(Socket.java:492)
at java.net.Socket.getImpl(Socket.java:552)
at java.net.Socket.setSoTimeout(Socket.java:1180)
at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
at com.example.controller.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:114)
at com.example.controller.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:93)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Aaron Villalobos
quelle

Antworten:

388

Behoben: Alles was ich tun musste, war die App vom Emulator zu deinstallieren und erneut auszuführen.

Aaron Villalobos
quelle
7
es hat auch bei mir funktioniert, jemals herausgefunden, warum es überhaupt passiert ist?
Vikas Pandey
9
In meinem Fall musste ich die Berechtigung ACCESS_NETWORK_STATE angeben. Fügen Sie dem Manifest <verwendeten Berechtigungen android: name = "android.permission.ACCESS_NETWORK_STATE" /> hinzu. Und deinstallieren Sie auch
sk md
2
Hier gilt das gleiche. Es ist seltsam, dass die Frage so jung ist. Vielleicht ist das ein Fehler.
user1511417
2
Neuinstallation der App auf dem Emulator half +1
Stevemaster92
1
Die Anwendung aus einem Emulator entfernt und erneut installiert, löste mein Problem, danke. Scheint, dass Firebase etwas im Dateisystem zwischenspeichert und wiederverwendet. Ich nehme an, dass klare Anwendungsdaten auch ein Problem lösen werden.
Onregs
38

Deinstallieren Sie einfach die App vom Emulator und führen Sie sie erneut aus. Es wird funktionieren. Ich hatte das gleiche Problem

Um die App zu deinstallieren, führen Sie Ihr Projekt aus, wenn die Meldung "Die Anwendung wurde gestoppt" angezeigt wird. Klicken Sie auf "App-Informationen" und deinstallieren Sie dann

John Alexander
quelle
1
Ich weiß nicht wie, aber das funktioniert. Posting im Dezember 2019. Obwohl dies funktioniert, neugierig zu wissen warum.
Rajkiran
30

Zunächst müssen Sie Ihr Android-Manifest .xml ändern. Nach dieser Aktion müssen Sie die Anwendung deinstallieren und erneut ausführen. https://developer.android.com/training/basics/network-ops/connecting

und Code hier:

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

in AndroidManifest.xml

Archil Labadze
quelle
1
Richtig, aber wenn dies bereits festgelegt ist und immer noch der gleiche Fehler auftritt - wie oben vorgeschlagen - löschen Sie die App auf dem Gerät und installieren Sie sie erneut.
Vladislav Varslavans
11

Ich musste die App vom Emulator deinstallieren und dann fing alles an zu funktionieren. Ich brauchte nur die folgende Berechtigung für die AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
Juan Cabello
quelle
9
  1. Fügen Sie im Manifest die Berechtigung ACCESS_NETWORK_STATE hinzu
  2. Neuinstallationsemulator
Habib Adnan
quelle
2

In android:usesCleartextTraffic="true"der Manifestdatei festlegen. Fügen Sie die Berechtigung hinzu INTERNET. Deinstallieren Sie die App und installieren Sie sie erneut.

Ssenyonjo
quelle
0

Wenn jemand dieses Problem immer noch hat, bin ich darauf gestoßen, als ich VPN verwendet und versucht habe, eine Verbindung zu WLAN herzustellen, während das Mobiltelefon eingeschaltet war. Ich habe den Anyconnect VPN-Client verwendet. Die Lösung besteht darin, den zulässigen Bypass zu aktivieren, mit dem Sie einen Socket an ein bestimmtes Netzwerk binden können, wenn Sie dies suchen.

AnyConnect verwendet allowBypass nur, wenn es in seinen verwalteten Einschränkungen (von EMM) über diesen Schlüssel konfiguriert ist: vpn_connection_allow_bypass.

ovidiur
quelle