java.net.SocketException: soket başarısız oldu: EPERM (İşleme izin verilmez)


144

Çeşitli etkinlikler içeren bir Android Studio projesi üzerinde çalışıyorum. Şu anda localhost'ta bir Java Servlet'in çıktısını okumaya çalışıyorum, ancak bir soket izni nedeniyle kilitleniyor gibi görünüyor.

Yeni bir proje yaptım, tamamen aynı kodu kullandım ve mükemmel çalıştım. Bu yüzden neden projem üzerinde çalışmak istemediğimi anlamıyorum.

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

Verileri okumasını bekliyorum ama şu satırda çöküyor:

InputStream in = urlConnection.getInputStream();

Bu, hata çıktısıdır:

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)

Yanıtlar:


395

Çözüldü: Tek yapmam gereken, uygulamayı emülatörden kaldırıp tekrar çalıştırmaktı.


8
benim için de işe yaradı, neden ilk etapta olduğunu buldun mu?
Vikas Pandey

9
Benim durumumda ACCESS_NETWORK_STATE izni vermem gerekiyordu. Manifest'e <uses-allow android: name = "android.permission.ACCESS_NETWORK_STATE" /> ekleyin. Ve çok da
sk md

3
Burada aynı. Sorunun bu kadar genç olması tuhaf. Belki bu bir hatadır.
user1511417

1
Bir emülatörden kaldırılan uygulama ve tekrar yükleme sorunumu çözdü, teşekkürler. Görünüşe göre firebase dosya sistemine bir şeyler önbelleğe alıp yeniden kullanıyor, sanırım uygulama verilerinin temizlenmesi de bir sorunu çözecektir.
Onregs

1
belki izinler zaten önbelleğe alınmış ve onu defalarca bozmak, izni güncellemiyor ve sadece src dosyalarını güncellemek yerine.? bu yeniden kurulum yardımcı oldu.
Atif AbbAsi

38

sadece uygulamayı emülatörden kaldırın, ardından tekrar çalıştırın ve çalışacak aynı sorunu yaşadım

uygulamayı kaldırmak için "uygulama durdu" mesajı göründüğünde projenizi çalıştırın, "uygulama bilgisi" ni tıklayın ve ardından kaldırın


1
Nasıl olduğunu bilmiyorum ama bu işe yarıyor. Aralık 2019'da yayınlanıyor. Bu işe yarasa da, nedenini merak ediyorum.
Rajkiran

30

Öncelikle android manifest .xml dosyanızı değiştirmeniz gerekir. Ancak bu işlemden sonra uygulamayı kaldırmalı ve tekrar çalıştırmalısınız. https://developer.android.com/training/basics/network-ops/connecting

ve buraya kodlayın:

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

içinde AndroidManifest.xml'de


2
Doğru, ancak bu zaten ayarlanmışsa ve hala aynı hatayı alıyorsa - yukarıda önerildiği gibi yapın - cihazdaki uygulamayı silin ve tekrar yükleyin.
Vladislav Varslavans

11

Uygulamayı emülatörden kaldırmam gerekti ve sonra her şey çalışmaya başladı. Sadece AndroidManifest.xml'de aşağıdaki izne ihtiyacım vardı

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

9
  1. Manifest'e ACCESS_NETWORK_STATE izni ekleyin
  2. Yeniden yükleme öykünücüsü

3

android:usesCleartextTraffic="true"Manifest dosyasında ayarlayın . İzni ekleyin INTERNET. Uygulamayı kaldırın ve ardından tekrar yükleyin.


0

Hala bu sorunu olan biri varsa, VPN kullandığımda karşılaştım ve hücresel ağ açıkken kablosuz ağa bağlanmaya çalıştım. Anyconnect VPN istemcisi kullanıyordum. Çözüm, aradığınız buysa, bir soketi belirli bir ağa bağlamanıza izin verecek izin verme baypasını etkinleştirmektir.

AnyConnect, yalnızca yönetilen kısıtlamalarında (EMM tarafından) şu anahtar aracılığıyla yapılandırılmışsa allowBypass'ı kullanır: vpn_connection_allow_bypass.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.