프로그래밍/Android Java

안드로이드 소켓 프로그래밍 / 클라이언트 - 서버 접속 #1

배기니어 2021. 1. 29. 22:47

지난 시간에 파이썬으로 서버를 프로그래밍 했다

2021/01/28 - [프로그래밍/Python] - 파이썬 소켓 프로그래밍 / 서버 프로그래밍 #1

 

파이썬 소켓 프로그래밍 / 1. 서버 프로그래밍 #1

첫 번째 프로젝트에서 안드로이드 디바이스 간 데이터 통신을 할 수 있는 앱을 구현하려고 한다. 자세한 기능은 나중에 기술하도록 하고 먼저 데이터 통신을 위한 서버를 구현하려고 한다. 학교

bagineer.tistory.com

 

이번에는 이 서버에 접속하기 위해 안드로이드에서 클라이언트 프로그래밍을 해보겠다

package com.example.connect;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    private static final String host = "192.168.1.4";
    private static final int port = 8080;

    private Socket s;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        s = new Socket();
        InetSocketAddress addr = new InetSocketAddress(host, port);
        try {
            s.connect(addr);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

host는 서버의 ip주소이고, port는 서버에서 개방한 port 번호를 사용한다

먼저 소켓 생성을 하고 주소 객체 addr을 생성하여 host, port를 할당한다

그리고 connect 메소드로 주소에 연결하면 된당

 

그림 1. 서버 상태

 

아니 이게 뭐시여. 되지 않는다

서버가 계속 listening 상태이다

뭐가 문제인가 로그캣을 확인해보았다.

 

그림 2. 안드로이드 로그캣

 

자세한건 모르겠고 에러가 나타나기 시작한 부분을 살펴보니 socket failed, operation not permitted라고 나온다

operation이라고 하면 connect에서 발생한 것 같고 이게 허용되지 않아서 소켓 연결이 실패했다 그런 뜻인듯

그래서 구글링 해보니 소켓은 인터넷을 이용한 연결 방법인데 인터넷 연결을 허용하지 않아서 그렇다고 한다

따라서 manifest에 인터넷 사용 권한을 허용해주면 된당

 

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

위의 코드를 AndroidManifest.xml에 추가하면 된다

 

※ AndroidManifest.xml 파일을 수정하고 나서는 앱을 삭제한 후 다시 설치해야 합니다 ※

 

이제 앱을 삭제하고 다시 실행하면!

 

그림 3. 로그캣 2

힝 속았징?

또 안된다 이번엔 무슨 일인가 뭔말인지도 모르겠는 로그캣을 내려보면서 확인했더니

 

그림 4. NetworkOnMainThreadException

NetworkOnMainThreadException이란다. 저기서 문제가 발생한 것 같다

또 구글링 해보니 메인 쓰레드에서 네트워크 통신 처리를 하려고 하면 발생하는 오류라고 한다

API level 13(Android 3.0)부터 이렇게 패치가 되었다고 한다

그렇다면 메인 쓰레드가 아니라 다른 쓰레드에서 처리를 해야할 것 같다.