배워서남준다

Android 앱에서 서버 통신 방법

Study4U, 2019-03-15 19:56:22

조회 수
187
추천 수
0

안드로이드 앱의 일부 정보를 서버로 보내고, 서버에서 처리된 내용을 리턴받아 처리하는 방법이다.

서버와 통신을 하는 주된 이유는 앱을 설치한 기기의 정보를 서버에 저장하고, 해당 기기에 푸시 알림을 보내기 위함이다.



1. 먼저 새로운 클래스를 하나 추가한다. 클래스 이름은 RequestHttpConnection 으로 한다.


AsyncTask01.jpg

AsyncTask02.jpg

AsyncTask03.jpg



package com.domain.myapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class RequestHttpConnection {

    public String request(String _url, String urlParameters){

        HttpURLConnection urlConn = null;
        try{
            URL url = new URL(_url);
            urlConn = (HttpURLConnection) url.openConnection();

            urlConn.setRequestMethod("POST"); // URL 요청에 대한 메소드 설정 : POST.
            urlConn.setRequestProperty("Accept-Charset", "UTF-8"); // Accept-Charset 설정.
            urlConn.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;charset=utf-8");

            OutputStream os = urlConn.getOutputStream();
            os.write(urlParameters.getBytes("UTF-8")); // 출력 스트림에 출력.
            os.flush(); // 출력 스트림을 플러시(비운다)하고 버퍼링 된 모든 출력 바이트를 강제 실행.
            os.close(); // 출력 스트림을 닫고 모든 시스템 자원을 해제.

            // 연결 요청 확인.
            // 실패 시 null을 리턴하고 메서드를 종료.
            if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK)
                return null;

            // 요청한 URL의 출력물을 BufferedReader로 받는다.
            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8"));

            String line;
            String page = "";
            while ((line = reader.readLine()) != null){
                page += line;
            }

            return page;

        } catch (MalformedURLException e) { // for URL.
            e.printStackTrace();
        } catch (IOException e) { // for openConnection().
            e.printStackTrace();
        } finally {
            if (urlConn != null)
                urlConn.disconnect();
        }

        return null;
    }
}


2. MainActivity.java 하단에 아래 구문을 추가한다.

AsyncTask04.jpg



public class NetworkTask extends AsyncTask<Void, Void, String> {

    private String url, values;

    public NetworkTask(String url, String values) {

        this.url = url;
        this.values = values;
    }

    @Override
    protected String doInBackground(Void... params) {

        String result; // 요청 결과를 저장할 변수.
        RequestHttpConnection requestHttpURLConnection = new RequestHttpConnection();
        result = requestHttpURLConnection.request(url, values);
        return result;
    }

    @Override
    protected void onPostExecute(String respond) {
        super.onPostExecute(respond);

        //doInBackground()로 부터 리턴된 값이 onPostExecute()의 매개변수로 넘어오므로 respond를 출력한다.
        parserJson(respond);
    }
}

public void parserJson(String respond) {
    try {
        JSONObject responseJSON = new JSONObject(respond);
        String info = (String) responseJSON.get("info");
        Toast.makeText(getApplicationContext(), info, Toast.LENGTH_LONG).show();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}


3. MainActivity 의 OnCreate 에서 서버로 보낼 정보를 스트링 형태로 NetworkTask 로 전달하고, 서버에서 리턴된 정보는 parserJson 에서 처리한다.

예제로 기기 정보를 전달하였다.


AsyncTask05.jpg


String urlParameters = "data="+Build.BRAND +"-"+ Build.MODEL + "-" + Build.VERSION.RELEASE;
String requestUrl = "https://myapp.domain.com/respondHttp.php";

// AsyncTask를 통해 HttpURLConnection 수행.
NetworkTask networkTask = new NetworkTask(requestUrl,urlParameters);
networkTask.execute();


4. 빌드하면 리턴된 정보가 토스트로 출력됨을 확인할 수 있다.

AsyncTask06.jpg

AsyncTask07.jpg


5. 서버에서의 처리과정은 "act=procMember" 와 같은 형태로 XE 모듈 액션으로 처리할 수도 있고, 외부 PHP 구문으로 직접 처리할 수도 있다.

외부 PHP 구문은 아래 repondHttp.php 파일을 참고한다.


<?php
define('__XE__', true);
require_once("./config/config.inc.php");
$oContext = &Context::getInstance();
$oContext->init();

$_TODAY = date("Y-m-d H:i");
$vars = Context::getRequestVars();
$_DATA = Context::get('data');
$objs = new stdClass();
$objs->data = $_DATA;
$objs->info = $_TODAY."에 리턴함.";

$oMangoController = getController('mango');
$oMangoController->response_json($objs);

?>


서버에서 처리된 정보를 JSON 형태로 리턴한다.

아래는 망고 모듈의 response_json 함수 내용이다.


function response_json($array)
{
	Context::close();

	$json = "";
	$json = json_encode($array);

	header('Content-Type: application/json; charset=utf-8');
	header('Content-Length: ' . mb_strlen($json));
	echo $json;

	exit();
}


첨부

0 댓글

목록

Page 1 / 5
번호 제목 날짜 조회 수
공지

IE에서 영상 또는 슬라이드 반응속도가 느린경우 해결방법

| 일반
  • file
2012-09-22 2546
91

Android 앱에서 서버 통신 방법

| 안드로이드
  • file
2019-03-15 187
90

Android WebView Sample

| 안드로이드
  • file
2019-03-14 167
89

사이트에 SNS 공유 버튼 등록방법

  • file
2019-03-05 220
88

IONIC for Synology

2019-02-26 110
87

Install NGINX + PHP + MARIADB for MAC

| 웹개발 1
2019-01-10 285
86

자주 사용하는 앱 개발 구문

2019-01-10 132
85

안드로이드 앱 제작 환경설정

| 안드로이드
  • file
2019-01-10 151
84

구글 캘린더 API 설정 방법

| 웹개발
  • file
2019-01-10 62
83

KT KOS, RDS 엑셀 보안문서를 엑셀 일반 문서로 변환하는 방법

| 일반 1
2019-01-09 133
82

Web Station(웹서버) 설정 for SYNOLOGY

| 웹개발
2019-01-09 96
81

USB 지정된 파일을 찾을 수 없습니다

| 일반
  • file
2017-09-23 2226
80

PHP 환경값 재설정 - for QNAP

2017-08-29 635
79

Oracle 12c 설치시 문제 해결 - 리눅스버전

2017-07-01 695
78

redmoon DB 설치

| 일반
  • file
2017-06-06 2738
77

CENTOS 7 초기 설정 가이드

| 웹개발
2016-07-24 2457
76

USB 메모리 인식불량일때

| 일반
2016-07-23 1264
75

"web" 공유 폴더에 있는 내 폴더를 권한없는 액세스로부터 어떻게 보호합니까?

  • file
2016-06-08 727
74

icecast & ices0 in 'synology' ? synices : icestation

2016-06-04 990
73

웹브라우저에서 마우스 클릭시 팝업 광고 문제 해결방법

2016-01-12 398
72

MySQL 사용자 권한 복구

  • file
2015-09-16 599

Board Links

Page Navigation