일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 텍스트뷰 자동 스크롤
- 리니어 레이아웃
- 서비스
- edwith
- 프로그래밍
- 안드로이드 스튜디오
- 레이아웃
- 부스트코스
- 아이폰
- 제약 레이아웃
- 액션바
- 안드로이드
- 프로젝트
- SceneDelegate
- 안드로이드_프로그래밍
- 드로어블
- textview auto scroll
- 뷰
- 자바
- 스낵바
- 테이블_레이아웃
- IOS
- 데이터베이스
- 상대 레이아웃
- RecyclerView
- 코드리뷰
- Swift
- 코틀린
- 수명주기
- 텍스트뷰 스크롤
- Today
- Total
듀다의 성장개발로그
[부스트코스] 안드로이드 프로그래밍 19 - 서버와 서비스 본문
이제 화면 레이아웃을 구성하는 것을 넘어서 서버와 통신하는 앱을 만들어 볼 차례입니다.
'서버와 통신' 이라고 하면 거창하게 들릴 수 있지만 그렇게 복잡한 개념이 아닙니다.
컴퓨터가(스마트폰이) 인터넷과 연결되어 있다면 그 사이에 데이터를 보내주는 기능이 필요할 것입니다. 이 기능을 수행하는 것이 바로 서버입니다.
서버에 데이터를 요청하는 것은 '클라이언트'의 역할이며, 이렇게 클라이언트가 요청하고 서버가 응답하는 것을 2-tier C/S모델이라고 합니다.
이 포스팅에서도 클라이언트 소켓과 서버 소켓으로 2-tier C/S모델을 구현해보겠습니다.
화면 레이아웃은 "클라이언트 시작"이라는 버튼 하나만 있는 것으로 구성하고
이너 클래스로 스레드를 하나 정의하겠습니다. 네트워킹을 사용할 때는 반드시 스레드를 사용해야 합니다.
class ClientThread extends Thread {
public void run() {
String host = "localhost";
int port = 5001;
try {
Socket socket = new Socket(host, port);
ObjectOutputStream outstream = new ObjectOutputStream(socket.getOutputStream());
outstream.writeObject("안녕!");
outstream.flush();
Log.d("ClientThread", "서버로 보냄.");
ObjectInputStream instream = new ObjectInputStream(socket.getInputStream());
Object input = instream.readObject();
Log.d("ClientThread","받은 데이터 : " + input);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ObjectOutputStream 객체의 writeObject 메소드로 전달하고
ObjectInputStream객체의 readObject 메소드로 전달받는 역할을 하는 클래스입니다.
기능이 잘 수행되었는지를 확인하기 위해 로그를 출력하도록 설정해줍니다.
안드로이드 개발자 문서 : ObjectOutputStream
안드로이드 개발자 문서 : ObjectInputStream
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClientThread thread = new ClientThread();
thread.start();
}
});
그리고 버튼을 클릭하면 위에서 정의한 스레드가 생성되도록 onClick메소드를 오버라이드합니다.
네트워킹을 사용하려면 AndroidManifest.xml에 인터넷에 대한 권한을 설정해주어야 합니다.
이제 서버 소켓을 만들겠습니다.
마찬가지로 스레드를 정의하고 ObjectOutputStream과 ObjectInputStream를 활용한 기능들을 넣어줍니다.
class ServerThread extends Thread {
public void run() {
int port = 5001;
try {
ServerSocket server = new ServerSocket(port);
Log.d("ServerThread", "서버가 실행됨.");
while(true) {
Socket socket = server.accept(); //이걸 호출하는 시점에 대기상태로 들어감.
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
Object input = inputStream.readObject();
Log.d("ServerThread", "input : "+input);
ObjectOutputStream outstream = new ObjectOutputStream(socket.getOutputStream());
outstream.writeObject(input + "from server.");
outstream.flush();
Log.d("ServerThread", "output 보냄.");
socket.close();//클라이언트의 요청을 처리하고 나면 소켓 객체를 끊어준다.
}
} catch (Exception e) {
e.printStackTrace();
}
}
ServerSocket 객체에서 accept를 호출하면 그 시점부터 요청을 대기하는 대기상태가 됩니다.
기본적인 구조는 클라이언트 객체와 크게 다르지 않습니다만, 서버에서는 클라이언트에서 보낸 데이터를 '읽는 것'을 먼저 해야겠죠?
읽고 나서 쓰고, 요청을 다 처리하고 나면 소켓 객체를 끊어줍니다.
마찬가지로 이 클래스에서도 객체 실행 기능을 수행할 버튼을 만들어주고, AndroidManifest.xml에서 권한을 설정해줍니다.
이제 클라이언트와 서버를 각각 실행하여 버튼을 누르면 로그가 찍히는 것을 확인할 수 있습니다.
그런데 액티비티는 시스템 리소스가 부족할 경우나, 기타 여러 가지 이유로 도중에 종료될 수 있습니다.
갑자기 서버가 끊어지는 일을 방지하기 위해선, 사실 서비스로 서버를 만들어주는 것이 좋습니다.
서비스에 관해서는 포스팅한적이 없었던 걸로 기억하는데요,
간단히 설명하자면 서비스란
화면은 없지만 화면이 없더라도 기능이 실행될 수 있게 만들어 주는 것입니다. 이것도 애플리케이션 구성 요소중 하나이지요.
서비스는 비정상 종료되어도 다시 실행되는데요,
예를 들면 시스템이 리소스 부족으로 서비스를 종료시켰더라도, 자동으로 다시 실행되게 합니다.
따라서 뒤에서 계속 실행되어야 하는 기능을 구현할 때 사용하기 좋습니다.
서비스로 서버를 만들려면 서버 소켓에서 서비스를 새로 추가해주어야 합니다.
new - Service - Service로 생성할 수 있습니다.
public void onCreate() {
super.onCreate();
Log.d("ChatService", "서비스가 실행됨.");
ServerThread thread = new ServerThread();
thread.start();
}
그리고 서버의 메인 클래스에서 정의한 스레드를 그대로 서비스의 이너 클래스로 선언해주고, 서비스의 onCreate에서 이 스레드가 생성되도록 만들어주어야 합니다. 참고로 서비스의 생명 주기는 onCreate, onDestroy 두 가지 뿐입니다.
Intent intent = new Intent(getApplicationContext(), ChatService.class);
startService(intent);
서비스를 실행하려면 시스템에 요청해주어야 합니다. 따라서 인텐트를 통해서 실행시켜야 합니다.
위의 코드를 버튼의 onClick에 기존 스레드 생성 코드 대신 넣어 줍니다.
로그를 보면 서비스를 통해 실행된 서버가 제대로 동작하는지 확인할 수 있습니다.
'안드로이드 > 부스트코스' 카테고리의 다른 글
[부스트코스] 안드로이드 프로그래밍 20 - Volley (0) | 2020.03.07 |
---|---|
[부스트코스] 안드로이드 프로그래밍 - 프로젝트 D 코드 리뷰 (0) | 2020.03.06 |
[부스트코스] 안드로이드 프로그래밍 18 - 스레드 (0) | 2020.03.06 |
[부스트코스] 안드로이드 프로그래밍 - 프로젝트 C 코드 리뷰 (0) | 2020.02.29 |
[부스트코스] 안드로이드 프로그래밍 17 - 액션바 만들기 (0) | 2020.02.28 |