java.net.SocketException: socket fail: EPERM (Không cho phép thao tác)


142

Tôi đang làm việc trên một dự án Android Studio với một số hoạt động. Tôi hiện đang cố gắng đọc đầu ra từ Java Servlet trên localhost nhưng dường như nó bị sập do sự cho phép của socket.

Tôi đã thực hiện một dự án mới, sử dụng cùng một mã chính xác và hoạt động hoàn hảo. Vì vậy, tôi không hiểu tại sao không sẵn sàng làm việc trong dự án của tôi.

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

Tôi hy vọng nó sẽ đọc dữ liệu nhưng nó gặp sự cố ở dòng này:

InputStream in = urlConnection.getInputStream();

Đây là đầu ra lỗi:

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)

Câu trả lời:


390

Đã giải quyết: Tất cả những gì tôi cần làm là gỡ cài đặt ứng dụng khỏi trình giả lập và chạy lại.


7
nó đã làm việc cho tôi quá, bao giờ tìm thấy lý do tại sao nó xảy ra ở nơi đầu tiên?
Vikas Pandey

9
Trong trường hợp của tôi, tôi đã phải cung cấp quyền ACCESS_NETWORK_STATE. Thêm <used-allow android: name = "ERIC.ACCESS_NETWORK_STATE" /> vào tệp kê khai. Và gỡ cài đặt quá
sk md

2
Tương tự ở đây. Thật kỳ lạ khi câu hỏi còn quá trẻ. Có lẽ đây là một lỗi.
dùng1511417

2
Cài đặt lại ứng dụng trên trình giả lập đã giúp +1
Stevemaster92

1
Đã xóa ứng dụng khỏi trình giả lập và cài đặt lại giải quyết vấn đề của tôi, cảm ơn. Có vẻ như firebase lưu trữ một cái gì đó vào hệ thống tập tin và sử dụng lại nó, tôi cho rằng dữ liệu ứng dụng rõ ràng cũng sẽ giải quyết vấn đề.
Onregs

38

chỉ cần gỡ cài đặt ứng dụng khỏi trình giả lập rồi chạy lại và nó sẽ hoạt động, tôi cũng gặp vấn đề tương tự

để hủy cài đặt ứng dụng chạy dự án của bạn khi thông báo "ứng dụng đã dừng" xuất hiện, nhấp vào "thông tin ứng dụng" rồi mở ra


1
Tôi không biết làm thế nào, nhưng điều này hoạt động. Đăng vào tháng 12 năm 2019. Mặc dù điều này hoạt động, tò mò muốn biết tại sao.
Rajkiran

30

Trước hết bạn cần thay đổi tệp kê khai Android .xml Nhưng sau hành động này, bạn phải gỡ cài đặt ứng dụng và chạy lại. https://developer.android.com/training/basics/network-ops/connecting

và mã ở đây:

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

trong AndroidManifest.xml


1
Đúng, mặc dù nếu điều đó đã được đặt và vẫn gặp lỗi tương tự - hãy làm như được đề xuất ở trên - xóa ứng dụng trên thiết bị và cài đặt lại.
Vladislav Varslavans

11

Tôi đã phải gỡ cài đặt ứng dụng khỏi trình giả lập và sau đó mọi thứ bắt đầu hoạt động. Tôi chỉ cần sự cho phép của mọi người trên AndroidManifest.xml

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

9
  1. Thêm quyền ACCESS_NETWORK_STATE trong tệp kê khai
  2. Trình giả lập cài đặt lại

2

Đặt android:usesCleartextTraffic="true"trong tệp kê khai. Thêm sự cho phép INTERNET. Gỡ cài đặt ứng dụng và sau đó cài đặt lại.


0

Nếu bất cứ ai vẫn gặp phải vấn đề này, tôi đã gặp phải nó khi tôi sử dụng VPN và cố gắng kết nối với wifi khi đang bật di động. Tôi đã sử dụng máy khách Anyconnect VPN. Giải pháp là cho phép bỏ qua cho phép bạn sẽ liên kết một ổ cắm với một mạng cụ thể nếu đây là những gì bạn đang tìm kiếm.

AnyConnect chỉ sử dụng allowBypass nếu được định cấu hình trong các hạn chế được quản lý của nó (bằng EMM), thông qua khóa này: vpn_connection_allow_bypass.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.