'php'에 해당되는 글 1건

  1. 2014.03.27 안드로이드 서버 php 통신(간단히) (12)

안드로이드 서버 php 통신(간단히)

|

안드로이드가 웹과 통신을 하기 위해선 아래 두가지가 필요하다.


1. 웹 서버 (php)

2. 인터넷 연결이 가능한 안드로이드 단말기 or 안드로이드 시뮬레이터


우리는 안드로이드 단말에서 정말 간단한 php 문을 호출할 생각이다.(나중에 응용가능하게)

웹 서버 같은경우에 apm 이나 wpn-xm 등을 설치해서 구축할수 있다.

설치방법은 구글신에게 물어보자.



php 코드 부분

먼저

값을 주고 받을 php 를 만든다.

아래는 아주 간단히 값을 받고 값을 전달하는 php문이다.


php 파일 이름은 phpTest.php 이다. 텍스트 편집기로 파일을 만들고 저장하자.

필자는 notpad++을 사용했다.


post 방식으로 각각 name, age, sex 라는 변수를 받아와

출력하는 간단한 php 입니다.



해당 php 파일을 자신의 서버에 올립시다.

아래 제가 생각하는 php에 대한 간단한 생각들.


php 통신

-보내주는건 많이 보내줄수있는듯 get 방식이든 post 방식이든 get방식같은경우에 글자수가 제한이 있고 주소창에서 입력이 가능하므로 결국엔 post 방식으로 보내주는게 안전할듯.

받을때는 echo 로 출력된 정보를 받는다고 생각하면 편할거같음. 받는 데이터 같은경우에 웹에있는 데이터를 받는다고 생각됨.

여러개의 데이터를 전송받기 위해서는 echo 에서 구분자를 이용한 방법이나 결국 json 형식으로 받는 수 밖에 없음(아님 xml)



결국 결론은 안드로이드 단말에서 php 서버에 보낼수 있는 변수들은 무제한이고, 받을수 있는 값들은 php 문에 출력되는 echo 문들 이다.

결국 이렇기 때문에 많은 데이터를 받을때는(mysql 사용등) json 형식같은 것을 사용해서 php 값들받게 되는것 같다.



안드로이드 코드부분

우리가 만들 안드로이드 코드는

버튼을 누르면 php 웹에 접속해서 원하는 값을 받는 코드입니다.

제일 먼저 해야될것은 AndroidMainfest에 인터넷이 가능하도록 퍼미션을 설정하는 것입니다.





그리고 active_main.xml 에서 버튼과 텍스트 뷰를 추가합니다.







허니콤이후로 네트워크 접속시 별도의 스레드를 돌려야 오류가 나지 않습니다.

AsyncTask를 사용합니다.







urlpath 에는 자기가 접속할 php 주소를 입력합니다.

onCreate 함수(엑티비티가 처음 시작할때 무조건 실행되는 함수)에서 

버튼과 텍스트뷰를 찾고 버튼을 클릭했을시에 HttpTask를 실행합니다.(AsyncTask)


  bn.setOnClickListener(new Button.OnClickListener(){
            public void onClick(View v) {

              new HttpTask().execute();               
            }           
        });




아래는 AsyncTask 입니다. 세번째 인자의 String를 입력했는데 이 값은 

doInBackground의 반환값이며, onPostExecute의 매개변수가 됩니다.

doInBackground의 반환값이 onPostExcute의 인자로 전달된다고 생각하면 될것 같습니다.

자세한 내용은 AsyncTask로 검색하면 나올것입니다.


php 상에서 post 값으로 받기 때문에 HttpPost 로 선언해주고

넘길 값들을 Vector 에 저장한후 웹으로 보내줍니다.




onPostExcute 에서 텍스트뷰를 변경해줍니다. onPostExcute는 doinBackground 가 실행된후 실행되는 함수이며,

안드로이드 메인 ui 같은경우에는 여기서 변경해주어야 에러가 나지 않습니다.








public class MainActivity extends Activity {

    Button bn;
    TextView result;
   
   
    //접속할주소
    private final String urlPath = "";
    private final String TAG = "PHPTEST";
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {      
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        bn = (Button)findViewById(R.id.btn);
        result = (TextView)findViewById(R.id._result);
       
        bn.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new HttpTask().execute();   
            }
           
        });
           
    }
   
    class HttpTask extends AsyncTask<Void, Void, String>{

        @Override
        protected String doInBackground(Void... voids) {
            // TODO Auto-generated method stub
            try{
                HttpPost request = new HttpPost(urlPath);
                //전달할 인자들
                Vector<NameValuePair> nameValue = new Vector<NameValuePair>();
                nameValue.add(new BasicNameValuePair("name", "홍길동"));
                nameValue.add(new BasicNameValuePair("age", "24"));
                nameValue.add(new BasicNameValuePair("sex", "male"));               
               
                //웹 접속 - utf-8 방식으로
                HttpEntity enty = new UrlEncodedFormEntity(nameValue, HTTP.UTF_8);
                request.setEntity(enty);
               
                HttpClient client = new DefaultHttpClient();
                HttpResponse res = client.execute(request);
                //웹 서버에서 값받기
                HttpEntity entityResponse = res.getEntity();
                InputStream im = entityResponse.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(im, HTTP.UTF_8));
               
                String total = "";
                String tmp = "";
                //버퍼에있는거 전부 더해주기
                //readLine -> 파일내용을 줄 단위로 읽기
                while((tmp = reader.readLine())!= null)
                {
                    if(tmp != null)
                    {
                        total += tmp;
                    }
                }
                im.close();
                //결과창뿌려주기 - ui 변경시 에러
                //result.setText(total);
                return total;               
            }catch(UnsupportedEncodingException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            //오류시 null 반환
            return null;
        }
        //asyonTask 3번째 인자와 일치 매개변수값 -> doInBackground 리턴값이 전달됨
        //AsynoTask 는 preExcute - doInBackground - postExecute 순으로 자동으로 실행됩니다.
        //ui는 여기서 변경
        protected void onPostExecute(String value){
            super.onPostExecute(value);
            result.setText(value);
        }       
    }      
}



Trackback 0 And Comment 12
  1. 구독 2014.05.18 22:53 address edit & del reply

    그..HttpTask가 다른 클래스인데 urlPath가 어떻게 불러와진거죠???

    • Favicon of https://hyunity3d.tistory.com BlogIcon 히아레인 2014.05.19 08:11 신고 address edit & del

      HttpTask 는 MainActivity안에 내부 클래스로 설정하였습니다.

  2. 감사 2014.05.21 20:00 address edit & del reply

    다음과 같은 부분에 컴파일 에러나는데 어떻게 해야하나요?
    - 클릭 리스너 부분에 (view)-> 이부분
    - Vector<~>
    - super.onOptionsItemSelected(item);

  3. Favicon of https://taetanee.tistory.com BlogIcon 테타니 2014.08.16 03:25 신고 address edit & del reply

    똑같이 했는데 실행오류 '*****이(가) 중지되었습니다'가 나네요.
    죄송하지만 프로젝트를 보내주실 수 있는지요ㅠㅠ
    xpxksl@gmail.com
    염치불구하고 부탁드립니다!

    • Favicon of https://hyunity3d.tistory.com BlogIcon 히아레인 2014.08.19 09:49 신고 address edit & del

      최근에 확인해본결과 수정한거라 똑같이 하시면 실행오류 안뜹니다.
      해당 프로젝트 파일은 없습니다.

  4. 좋은글감사해요 2014.10.01 23:51 address edit & del reply

    올려주신 글로 실습중인데요
    버튼클릭시 아무 반응이 없더라구요
    해서 로그를 보니
    HttpHostConnectException: Connection to http://ip주소 .php refused

    ConnectException : http://ip주소.php : connect failed:EHOSTUNREACH
    이렇게 2개의 익셉션이 떠서 보니까
    컴퓨터상에서는 웹브라우져로 접근해서 echo부분확인이 되는데
    안드로이드에서 똑같이 http주소로 접근하니 없는페이지로 뜨더라구요
    웹페이지를 표시할 수 없습니다. 이 화면이요

    구글링으로 방화벽과 dmz? 부분을 해봤는데 여전하네요ㅠㅠ
    혹시 해결방법 아시나요? 라우터문제라고도 하는데.. 혹시 아는부분있으시면 답변 부탁좀 드립니다.
    2일째 붙잡고있네요ㅠㅠ

    • Favicon of https://hyunity3d.tistory.com BlogIcon 히아레인 2014.10.02 09:13 신고 address edit & del

      먼저 해당 주소로 안드로이드 기기에서 접속해 보세요.
      접속이 되나 확인해보시고 안되면 외부에서 접속이 불가능 한겁니다.
      <?php
      echo "test";
      ?>
      이런식으로 php 페이지를 만들어 들어가서 test라는 글자가 잘뜨나 확인하면 됩니다.

      외부에서 접속이 불가능하면 해당 컴퓨터환경에서 포트포워딩을 열어 80번 포트를 열어주거나 dmz를 열어주셔야됩니다.

  5. 잘모르겟어요 2014.11.22 15:38 address edit & del reply

    음 안드로이드와 php연동 연습중에있습니다. 이거 그대로 하면 버튼 누르면
    <!DOCTYPE HTML PUBLIC"-//IETF//DTD HTML 2.0//EN"><html><head><title>403Forbidden</title></head><body><h1>Forbidden</h1><p>You don't have permission to access/text.phpon(Win64)PHP/5.5.12 Server at 192.168.123.126 Port 80</address></body></html> 이렇게나오는데 무엇이 잘못된걸까요,,모르겠습니다.

  6. asd 2015.01.27 14:39 address edit & del reply

    이거 그대로 php파일만들어서 실행하는데
    바로 오류뜨고 강제종료되던데..되는소스맞아요 ??

  7. 잘봤습니다. 2015.01.28 11:07 address edit & del reply

    프로그램 실행하자마자 오류로 인해 종료되었꼬 logcat을 보니 이렇게 떳는데 이유가무었을까요 ?
    블로그 글과 똑같이 작성했습니다...ㅠㅠㅠ

    01-28 10:59:17.836: E/(10924): Device driver API match
    01-28 10:59:17.836: E/(10924): Device driver API version: 23
    01-28 10:59:17.836: E/(10924): User space API version: 23
    01-28 10:59:17.836: E/(10924): mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Fri Nov 29 14:18:37 KST 2013
    01-28 10:59:17.901: D/OpenGLRenderer(10924): Enabling debug mode 0
    01-28 10:59:29.356: W/dalvikvm(10924): threadid=12: thread exiting with uncaught exception (group=0x42397700)
    01-28 10:59:29.356: E/AndroidRuntime(10924): FATAL EXCEPTION: AsyncTask #1
    01-28 10:59:29.356: E/AndroidRuntime(10924): java.lang.RuntimeException: An error occured while executing doInBackground()
    01-28 10:59:29.356: E/AndroidRuntime(10924): at android.os.AsyncTask$3.done(AsyncTask.java:299)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.lang.Thread.run(Thread.java:841)
    01-28 10:59:29.356: E/AndroidRuntime(10924): Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=susemi.pe.kr/test/index.php
    01-28 10:59:29.356: E/AndroidRuntime(10924): at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:591)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at com.example.dbtest3.MainActivity$HttpTask.doInBackground(MainActivity.java:73)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at com.example.dbtest3.MainActivity$HttpTask.doInBackground(MainActivity.java:1)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at android.os.AsyncTask$2.call(AsyncTask.java:287)
    01-28 10:59:29.356: E/AndroidRuntime(10924): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    01-28 10:59:29.356: E/AndroidRuntime(10924): ... 4 more
    01-28 10:59:31.646: I/Process(10924): Sending signal. PID: 10924 SIG: 9

    • Favicon of https://it-proram.tistory.com BlogIcon 하늘아래전사 2021.11.11 14:27 address edit & del

      관리자의 승인을 기다리고 있는 댓글입니다

prev | 1 | next