java.net.SocketException: socket gagal: EPERM (Operasi tidak diizinkan)

144

Saya sedang mengerjakan proyek Android Studio dengan beberapa aktivitas. Saat ini saya mencoba membaca output dari Java Servlet di localhost tetapi tampaknya macet karena izin soket.

Saya telah membuat proyek baru, menggunakan kode yang sama persis dan bekerja dengan sempurna. Jadi saya tidak mengerti mengapa tidak mau mengerjakan proyek saya.

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

Saya Berharap untuk membaca data tetapi macet di baris ini:

InputStream in = urlConnection.getInputStream();

Ini adalah hasil kesalahan:

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
sumber

Jawaban:

395

SOLVED: Yang perlu saya lakukan adalah mencopot pemasangan aplikasi dari emulator dan menjalankannya lagi.

Aaron Villalobos
sumber
8
itu berhasil untuk saya juga, pernah menemukan mengapa hal itu terjadi di tempat pertama?
Vikas Pandey
9
Dalam kasus saya, saya harus memberikan izin ACCESS_NETWORK_STATE. Tambahkan <using-permission android: name = "android.permission.ACCESS_NETWORK_STATE" /> ke manifest. Dan hapus juga
sk md
3
Sama disini. Aneh bahwa pertanyaannya masih sangat muda. Mungkin ini bug.
pengguna1511417
1
Aplikasi yang dihapus dari emulator dan instal lagi menyelesaikan masalah saya, terima kasih. Tampaknya firebase menyimpan sesuatu ke sistem file dan menggunakannya kembali, saya kira data aplikasi yang jelas juga akan menyelesaikan masalah.
Onregs
1
mungkin izin sudah di-cache dan merusaknya lagi dan lagi adalah tidak memperbarui izin dan alih-alih hanya memperbarui file src.? itu instalasi ulang membantu.
Atif AbbAsi
38

cukup hapus instalan aplikasi dari emulator lalu jalankan lagi dan itu akan berfungsi. Saya memiliki masalah yang sama

untuk mencopot aplikasi, jalankan proyek Anda ketika pesan "aplikasi telah berhenti" muncul, klik "info aplikasi" lalu batalkan pencabutan

John Alexander
sumber
1
Saya tidak tahu bagaimana, tapi ini berhasil. Posting pada Desember 2019. Meskipun berhasil, penasaran ingin tahu alasannya.
Rajkiran
30

Pertama-tama Anda perlu mengubah manifes android Anda .xml Tetapi setelah tindakan ini Anda harus menghapus aplikasi dan menjalankannya lagi. https://developer.android.com/training/basics/network-ops/connecting

dan kode di sini:

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

di AndroidManifest.xml

Archil Labadze
sumber
2
Benar, meskipun jika itu sudah disetel dan masih mendapatkan kesalahan yang sama - lakukan seperti yang disarankan di atas - hapus aplikasi di perangkat dan instal lagi.
Vladislav Varslavans
11

Saya harus mencopot pemasangan aplikasi dari emulator dan kemudian semuanya mulai berfungsi. Saya hanya membutuhkan izin berikut di AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
Juan Cabello
sumber
9
  1. Tambahkan izin ACCESS_NETWORK_STATE dalam manifes
  2. Emulator penginstalan ulang
Habib Adnan
sumber
2

Ditetapkan android:usesCleartextTraffic="true"di file manifes. Tambahkan izin INTERNET. Copot pemasangan aplikasi lalu pasang lagi.

Ssenyonjo
sumber
0

Jika ada yang masih memiliki masalah ini, saya mengalaminya saat menggunakan VPN dan mencoba menyambung ke wifi saat seluler aktif. Saya menggunakan klien VPN Anyconnect. Solusinya adalah dengan mengaktifkan allow bypass yang memungkinkan Anda mengikat soket ke jaringan tertentu jika ini yang Anda cari.

AnyConnect hanya menggunakan allowBypass jika dikonfigurasi dalam batasan terkelola (oleh EMM), melalui kunci ini: vpn_connection_allow_bypass.

ovidiur.dll
sumber