티스토리 뷰
java.net.SocketException: socket failed: EPERM (Operation not permitted) 에러 수정하기
맨날치킨 2023. 2. 22. 16:05Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
java.net.SocketException: socket failed: EPERM (Operation not permitted)
java.net.SocketException: 소켓 실패: EPERM (허가되지 않은 작업)
문제 내용
I am working on an Android Studio project with several activities. I am currently trying to read the output from a Java Servlet on localhost but it seems to be crashing due to a socket permission.
여러 액티비티가 있는 Android Studio 프로젝트에서 작업 중입니다. 현재 localhost에서 Java Servlet의 출력을 읽으려고 하지만 소켓 권한 때문에 충돌하는 것 같습니다.
I've made a new project, used the exact same code and worked perfectly. So I dont understand why is not willing to work on my project.
새 프로젝트를 만들고 정확히 같은 코드를 사용하면 완벽하게 작동합니다. 그래서 왜 내 프로젝트에서 작동하지 않는지 이해가 안됩니다.
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();
}
}
I Expect it to read the data but it crashes at this line:
데이터를 읽을 것으로 예상하지만 이 줄에서 충돌합니다.
InputStream in = urlConnection.getInputStream();
This is the error output:
다음은 오류 출력입니다:
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)
높은 점수를 받은 Solution
Your app needs additional permissions and/or to be reinstalled.
앱을 다시 설치하려면 추가 권한이 필요합니다.
Add additional permissions to AndroidManifest.xml
within the <manifest>
section:
<manifest> 섹션 내에서 AndroidManifest.xml에 추가 권한을 추가하십시오.:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
To reinstall, uninstall the app from the emulator or physical connected device and then run it again. (If adding permissions, make sure to reinstall afterwards.)
재설치하려면 에뮬레이터 또는 물리적으로 연결된 기기에서 앱을 제거 한 다음 다시 실행하십시오. (권한을 추가한 후에는 반드시 다시 설치해야 합니다.)
가장 최근 달린 Solution
Working solution.
작동하는 해결 방법:
- check if you have INTERNET permission and ACCESS_NETWORK_STATE permission, if not add these.
INTERNET 권한과 ACCESS_NETWORK_STATE 권한이 있는지 확인하고, 없으면 추가하십시오.
- uninstall the app and install again. If not try in different device. It will work 100%. I face same issue and solved this by using these steps.
앱을 제거하고 다시 설치하십시오. 작동하지 않으면 다른 기기에서 시도하십시오. 100% 작동합니다. 같은 문제가 발생했고 이 단계를 사용하여 해결했습니다.
출처 : https://stackoverflow.com/questions/56266801/java-net-socketexception-socket-failed-eperm-operation-not-permitted
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드에서 이전 화면으로 돌아가고 액티비티를 종료하는 방법 (0) | 2023.02.23 |
---|---|
안드로이드에서 서비스에서 액티비티를 시작하는 방법 (0) | 2023.02.23 |
액티비티 종료하기 전에 대화상자 띄워 재확인하기 (0) | 2023.02.22 |
어떤 동작을 클릭했을 때 알림(notification)을 제거하기 (0) | 2023.02.21 |
Android WebView에서 JavaScript alert 동작하지 않는 문제 (0) | 2023.02.21 |