web-dev-qa-db-fra.com

java.net.SocketException: échec du socket: EPERM (opération non autorisée)

Je travaille sur un projet Android Studio avec plusieurs activités. J'essaie actuellement de lire la sortie d'un servlet Java sur localhost mais il semble planter) en raison d'une autorisation de socket.

J'ai fait un nouveau projet, j'ai utilisé exactement le même code et j'ai parfaitement fonctionné. Je ne comprends donc pas pourquoi je ne souhaite pas travailler sur mon projet.

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

Je m'attends à ce qu'il lise les données, mais il se bloque à cette ligne:

InputStream in = urlConnection.getInputStream();

Voici la sortie d'erreur:

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)
94
Aaron Villalobos

Si quelqu'un a toujours ce problème, je l'ai rencontré lorsque j'ai utilisé un VPN et essayé de me connecter au wifi alors que le cellulaire était allumé. J'utilisais le client VPN Anyconnect. La solution consiste à activer le bypass autorisé qui vous permettra de lier un socket à un réseau spécifique si c'est ce que vous recherchez.

AnyConnect n'utilise allowBypass que s'il est configuré dans ses restrictions gérées (par EMM), via cette clé: vpn_connection_allow_bypass.

0
ovidiur