programing

java.net 를 참조해 주세요.Socket Exception : 소켓 장애 : EPERM (조작 불가)

sourcetip 2022. 8. 28. 12:28
반응형

java.net 를 참조해 주세요.Socket Exception : 소켓 장애 : EPERM (조작 불가)

저는 Android Studio 프로젝트를 여러 가지 활동으로 진행하고 있습니다.현재 localhost의 Java Servlet 출력을 읽으려고 하는데 소켓 권한으로 인해 크래시가 발생하고 있는 것 같습니다.

새로운 프로젝트를 만들어서 똑같은 코드를 사용했고 완벽하게 작동했어요.그래서 나는 왜 내 프로젝트에 기꺼이 참여하지 않는지 이해할 수 없다.

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

데이터를 읽어야 하는데 다음 행에서 크래시됩니다.

InputStream in = urlConnection.getInputStream();

에러 출력은 다음과 같습니다.

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)

해결: 필요한 것은 에뮬레이터 또는 물리적으로 연결된 디바이스에서 앱을 제거한 후 다시 실행하는 것이었습니다.

에뮬레이터에서 앱을 제거한 후 다시 실행하면 작동합니다.저도 같은 문제가 있었어요.

"어플리케이션이 중지되었습니다"라는 메시지가 뜨면 프로젝트를 실행하려면 "앱 정보"를 클릭한 다음 제거합니다.

먼저 안드로이드 매니페스트 .xml을 변경해야 합니다.단, 이 작업을 수행한 후에는 응용 프로그램을 제거하고 다시 실행해야 합니다.https://developer.android.com/training/basics/network-ops/connecting

및 코드는 다음과 같습니다.

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

AndroidManifest.xml의 경우

추가하는 것을 잊은 경우<uses-permission android:name="android.permission.INTERNET" />Manifest.xml로 전송, 지금 바로 실행

이미 추가했지만 오류가 해결되지 않으면 먼저 앱을 제거한 후 i를 다시 실행하십시오.
잊어버려서 같은 문제에 부딪히는 경우가 많다<uses-permission android:name="android.permission.INTERNET" />내 첫 작품에서.
OS는 앱이 인터넷 권한(바보 IMO)을 필요로 하지 않으며 앱에 대한 권한 업데이트(바보 IMO)를 확인하지 않을 것이라고 생각했다.

Android OS에 업데이트된 권한 요청을 확인하도록 지시하는 유일한 방법은 다시 설치하기 전에 먼저 앱을 제거하는 것입니다.

둘 다 아닌 것 같아

  • <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 도 아니다android:usesCleartextTraffic="true"여기서 정말 중요한 건

나는 에뮬레이터에서 앱을 제거해야 했고 모든 것이 작동하기 시작했다.AndroidManifest.xml에 대한 다음 권한이 필요합니다.

<uses-permission android:name="android.permission.INTERNET" />
  1. 매니페스트에 ACCESS_NETWORK_STATE 사용 권한 추가
  2. 재설치 에뮬레이터

안드로이드 에뮬레이터에서도 같은 문제가 발생하였습니다.

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

그리고.

android:usesCleartextTraffic="true"

앱을 재설치해도 에뮬레이터에서 문제가 발생하였습니다.

[ AVD Manager ]-> [우클릭]-> [ Cold Boot Now ](콜드 부트)

인터넷 권한/clearTextTraffic을 추가하지 않고 앱을 실행하면 캐시를 저장하기 때문에 콜드 부팅이 필요할 수 있습니다.

★★android:usesCleartextTraffic="true"이치노 " " 를 추가합니다.INTERNET을 제거한 후합니다. 앱을 제거한 후 다시 설치합니다.

매니페스트 파일에서 usesCleartextTraffic="true"를 설정합니다.사용 권한 INTERNET을 추가합니다.앱을 제거한 후 다시 설치합니다.

Mac에서 로컬호스트 서버를 사용하는 경우 머신에 할당된 로컬 IP 주소를 API 주소로 사용합니다.예를 들어 localhost 또는 127.0.0.1이 아닌 192.168.x.x(설정 -> 네트워크에서 검색).

위에서 설명한 바와 같이 앱을 제거한 후 매니페스트에 다음 태그를 추가합니다.

응용 프로그램 섹션에서 다음을 수행합니다.

android:usesCleartextTraffic="true"

그런 다음 매니페스트 섹션에서 다음을 수행합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.a.myapp">
    <uses-permission android:name="android.permission.INTERNET" />

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

유효한 솔루션.

  1. 인터넷 권한과 ACCESS_NETWORK_STATE 권한이 있는지 확인합니다(추가되지 않은 경우).
  1. 앱을 제거한 후 다시 설치합니다.다른 디바이스에서 시도하지 않을 경우.100% 동작합니다.저는 같은 문제에 직면해 있으며, 이 단계를 통해 이 문제를 해결했습니다.

아직도 이 문제가 있는 사람이 있다면, 휴대폰이 켜져 있는 상태에서 VPN을 사용하여 wifi에 접속하려고 했을 때 이 문제가 발생했습니다.Anyconnect VPN 클라이언트를 사용하고 있었습니다.해결방법은 특정 네트워크에 소켓을 바인드할 수 있는 허가 바이패스를 유효하게 하는 것입니다.

AnyConnect는 관리대상 제한(EMM에 의해)으로 설정되어 있는 경우에만 vpn_connection_allow_bypass 키를 사용하여 allowBypass를 사용합니다.

나는 이것을 삭제해야만 했다.

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

그리고 이것을 가지고 있다.

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

이 있지만, 이 , 이 문제를 알게 .android:usesCleartextTrafficAPI 23으로 하겠습니다.module파일을 gradle 빌드 파일 23은 gradle 빌드 파일입니다.

언급URL : https://stackoverflow.com/questions/56266801/java-net-socketexception-socket-failed-eperm-operation-not-permitted

반응형