안드로이드와 외부서버와의 통신방법

프로그래밍|2013. 5. 11. 06:00
안드로이드와 외부서버와의 통신방법


안드로이드를 통해 어플을 공부를 한다는 건 자체가 쉬운 일이 아닌 것 같습니다. 몇 번 몇 번 하다가 안되면 금방 포기해버리기 쉬운 반면에 꾸준히 하기란 참 쉽지 않네요.


기존의 홈페이지를 제작하는 방법과 달리 안드로이드는 스마트폰 자체에서 개발을 해야 되기 때문에 스마트폰 자체 내에서 외부서버와 연결을 할 수 없는 단점이 있습니다.



드로이드와 외부서버와 연결을 할려면 중간과정을 거쳐야 됩니다. 즉, 한 단계를 더 거쳐야 됩니다. 외부서버(MSSQL, ORACLE, MYSQL) -> JSP, PHP -> Android -> JSP, PHP -> 외부서버(MSSQL, ORACLE, MYSQL) 이런 식으로 순서를 거쳐야 됩니다. 외부서버와 통신을 할려면 과정이 약간 복잡해지기도 합니다.


안드로이드와 JSP 간단한 통신하는 방법 ☞ [포스팅 보러가기]

안드로이드에서 외부서버와 바로 연결을 할 수 없는 단점에 대해서 설명을 드리면 스마트폰은 일반 PC의 축소판이라고 생각을 하시면 됩니다. 요즘 들어 이슈가 되고 있는 것이 해킹입니다. PC에서도 백신을 설치를 하더라도 바이러스의 만드는 속도가 백신의 개발을 하는 속도를 초월하고 있을 정도로 1초에 3개씩 바이러스가 만들어 지고 있는 실정입니다. 허나 이런 바이러스나 해킹이 스마트폰일 수록 약하다면 참으로 황당한 일이 발생할 수도 있습니다.

명의도용방지, 본인 신용정보 조회, 신용 평점 조회 등 서비스제공
사이렌24 ☞
http://www.siren24.com


스마트폰 내부에 개인정보가 세어 나갈 수도 있고, 본인이 친구나 지인들에게 대화했던 내용, 스마트폰에 저장되어 있는 금융(은행 공인인증서)에 관련된 것과 스마트폰에 저장된 정보들을 해커들이 가져갈 수가 있습니다. 보안이 약하다면 스마트폰에서 치명적인 단점이 되어 버립니다. 잘 한번 생각을 해보시면 우리가 모르는 사이에 누군가가 다른 사람의 컴퓨터에 침입을 할 수도 있고, 인터넷 커뮤니티 아이디가 비밀번호가 바뀌어져 있는 경우가 있을 것입니다.



위와 같은 상황이라면 현재 안심을 하고 계시다면 정말 좋지 않은 일이 일어날 수가 있습니다. 예전에 안드로이드와 외부서버간의 통신하는 방법을 찾기 위해 몇 날 몇 일을 인터넷에 찾으러 다닌것 같습니다. 단순히 안드로이드 내부서버(SQLite)만 이용을 한다고 가정을 하면 개인 스마트폰안에서만 내부서버로 데이터를 넣고 데이터를 받는 식으로 사용을 하실 수 있습니다. 단순히 외부서버로 가는 것이 아니고, 쉽게 설명을 드리면 흔히 일기장, 달력, 메모장, 일정관리 등을 에를 들 수 있습니다. 


각각의 스마트폰에 공통적으로 설치되어 있는 것이라고 하면 메모장, 달력, 일정관리, 일기장입니다. 스마트폰에 메모장에 메모를 하거나 달력에 계획을 세우고 일정관리에 본인이 원하는 일정, 일기장에는 본인의 하루일과를 적으셔도 다른 곳에 흘러나가지 않고 오로지 내부서버에 존재하고 있습니다. 단 스마트폰에 자체적으로 구글 계정이나 각 통신사에서 제공하는 개인 저장소 같은 곳에 저장을 해둘 수 있습니다.

인터넷팩스 1위, 개인 수신번호 제공, 무료 팩스 10장 받기
엔팩스 ☞
http://enfax.ppurio.com/

내부서버는 스마트폰 안에 있는 서버이기 때문에 외부서버에서 안드로이드와 데이터를 받아올려면 XML형태의 데이터를 파싱을 해서 가지고 와야 됩니다. 파싱은 말 그대로 각 각의 데이터를 차례대로 끍어온다는 의미입니다. 저도 이런 파싱의 의미와 파싱을 통한 프로그래밍을 터특하기 까지 많은 시간이 걸렸습니다. 아직까지는 고급 개발자가 아니고 중간 개발자도 아닙니다. 여러 시행착오를 겪고 있는 초보 개발자입니다. 아직은 고수는 아니지만 여러분들을 위해 알려드릴 수는 있습니다.

외부서버에 있는 xml을 안드로이드 내에서 파싱을 하는 방법을 알려드리겠습니다.

안드로이드로 파싱을 하기 위해서는 xml파일이 필요합니다.
xml파일은 외부서버에 있어야 됩니다. 웹호스팅 계정이나 서버 같은 곳에 있어야 됩니다. 개인이 구축해 놓은 서버도 상관이 없으십니다. 저는 대체로 웹호스팅을 이용하고 있습니다.



xml소스는 아래와 같습니다.

<?xml version="1.0" encoding="utf-8" ?>
<navi>

<menu>
<name>윤하</name>
<best>비밀번호486</best>
</menu>

 

<menu>
<name>가비엔제이</name>
<best>연애소설2</best>
</menu>

</navi>

위의 형태로 구성이 되어있습니다. 텍스트 문서에 작성을 하시고 인코딩을 UTF-8로 사용하시길 바랍니다. ANSI을 사용을 하시면 글자가 깨지는 현상이 나타날 수도 있습니다. 과거 JSP프로그래밍을 할 때 ANSI로 저장을 한 적이 있는데 글자가 깨지는 현상이 있었습니다. 인코딩이 제대로 안맞아서 그런 것일 수도 있습니다. 반드시 UTF-8로 저장을 하시길 바랍니다.


저장하신 xml파일을 FTP프로그램을 이용을 하셔서 본인의 웹호스팅이나 서버 계정에 접속을 하셔서 xml파일을 올리시길 바랍니다.


알FTP로 웹호스팅에 접속을 쉽게 하자 [포스팅 보러가기]

이제 안드로이드에서 xml파일을 파싱을 하여서 끍어오는 방법에 대해서 알려드리겠습니다.
여러번 시도 끝에 성공한 방법입니다. 아직까지 파싱에 대한 부분이 많이 부족합니다. 알고 있는 만큼 알려드리겠습니다.

android 소스를 보여드리겠습니다.

◎ android xml소스

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/txtResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge" />
   
</LinearLayout>

◎ android java소스

package kr.dpu.MobilePrints;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import kr.dpu.MobilePrints.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Browser;
import android.provider.Contacts.Intents;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.HttpAuthHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MobilePrintsActivity extends Activity {
 String xml;
 TextView txtResult;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtResult = (TextView)findViewById(R.id.txtResult);
       
  StringBuffer sBuffer = new StringBuffer();
  try {
   String urlAddr = "http://본인의 웹 호스팅 주소 및 서버 주소 적기/data.xml";
   //위의 사이트에는 본인의 웹호스팅 주소나 서버 주소를 적으시고 뒤에 data.xml 넣으시길 바랍니다.
   URL url = new URL(urlAddr);
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   if(conn != null) {
    conn.setConnectTimeout(20000);
    conn.setUseCaches(false);
    if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
     InputStreamReader isr = new InputStreamReader(conn.getInputStream());
     BufferedReader br = new BufferedReader(isr);
     while(true) {
      String line = br.readLine();
      if(line == null) {
       break;
      }
      sBuffer.append(line);
     }
     br.close();
     conn.disconnect();
    }
   }
   xml = sBuffer.toString();
  } catch(Exception e) {
   Log.e("다운로드 중 에러 발생", e.getMessage());
  }
  parse();
}
 public void parse() {
  try {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder documentBuilder = factory.newDocumentBuilder();
   InputStream is = new ByteArrayInputStream(xml.getBytes());
   Document doc = documentBuilder.parse(is);
   doc.getDocumentElement().normalize();
   
   NodeList headline_node_list = doc.getElementsByTagName("menu");
   String name = "", best = "";
   String text = "";
   
   for(int i = 0;i<headline_node_list.getLength(); i++) {
    Node headline_node = headline_node_list.item(i);
    if(headline_node.getNodeType() == Node.ELEMENT_NODE) {
     Element element = (Element) headline_node;
     NodeList node_list = element.getElementsByTagName("name");
     Node node = node_list.item(0);
     name = node.getTextContent();
    }
    if(headline_node.getNodeType() == Node.ELEMENT_NODE) {
     Element element = (Element) headline_node;
     NodeList node_list = element.getElementsByTagName("best");
     Node node = node_list.item(0);
     best = node.getTextContent();
    }
    text += (name + "    " + best +"\n");
   }
   
   txtResult.setText(text.toString());

   } catch(Exception e) {
    Log.e("파싱 중 에러 발생", e.getMessage());
   }
  }
}


안드로이드 xml, java소스입니다.
Manifest.xml에서 아래와 같이 추가를 하셔야 됩니다.

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

위의 2 줄을 추가를 하시길 바랍니다.
소스를 직접 타이핑을 해보시면 어느 정도 이해가 가실 것입니다. 결과는 아래와 같습니다.


외부서버에 있는 data.xml에서 파싱이 되어 스마트폰 상으로 보여지게 됩니다.
가수이름 및 곡 명을 각 각 차례대로 끍어왔습니다. 하나 하나씩 파싱이 되어져 오는 것입니다.
흔히 쌀 한 톨 한 톨 담는 다고 생각을 하시면 됩니다.

약간 어려울 것 같지만 위의 소스라면 누구나 쉽게 하실 수 있습니다. 생각을 달리 하시면 응용이 가능합니다. 프로그래밍은 남이 떠주는 것이 아니라 본인이 직접 하는 것이 프로그래밍을 하는 데 있어서 발전을 할 수 있으리라 확신을 가집니다. 본인이 스스로 황무지에 개척을 할 줄을 안다면 프로그래밍도 마찬가지 일 것입니다.


완벽하지는 않지만 언제나 노력을 하겠습니다. 아직은 많이 모르는 초보개발자이지만 꾸준히 개발을 할 것이며 개발을 포기하지 않을 것입니다. 제가 직접 단독적으로 개발도 할 예정입니다. 


저의 안드로이드 가이드가 여러분들께 좋은 정보가 되고 배움이 되시길 진심으로 기원합니다.
언제나 행복한 하루를 보내시길 바랍니다. 오늘 하루도 파이팅!!

댓글()