홈으로 | 무료회원가입 | 아이디/비번찾기
추천음악방송 메인홈 1대1상담
운.영.자.1대1.상담
온라이브 음악방송
음악방송 앱 다운로드
OKTROT(무료음악채널)
뽕짝아가씨(무료음악채널)
아리랑가요(무료음악채널)
전통가요(무료음악채널)
보안∵서버∵쿠키
윈도우∵프레임
이미지∵배경
시간∵달력∵계산
상태바∵타이틀바
음악∵영상
폼∵전송∵테이블
키보드∵마우스
효과∵링크∵메뉴
Script∵php
기타
PHP 강좌
윈도우관련팁
웹관련팁
홈페이지제작팁
기본강좌
레지스트리
윈도우서버
리눅스서버
Android
안드로이드에서 웹서버에 post로 글쓰기 [Android]
4년 전
안드로이드 코드상에서 간단히 id, pass를 post 방식으로 쓰고,
웹서버는 php를 사용하였다.
php에서 받은 글을 txt로 저장한 후, echo로 결과를 쓴다.
그러면, 안드로이드는 그 웹서버의 echo를 받아서 에뮬 화면에 작성하는 코드이다.

안드로이드에서 올린 글을 받아내서 반응하는 php 코드:

php가 안드로이드의 글을 받았는지 서버단에서의 확인을 하기 위해,
db에 연결하지 않고 일단 간단히 반응이 오면 파일을 작성해보았다.

<?
$id=$_REQUEST[id];
//echo("id: ".$id);
$pass=$_REQUEST[pass];
//echo("pass: ".$pass);

$imgpath = "/home/hosting_users/radstyle/www";
$fp=fopen($xmlpath."./test.txt",'w');
fwrite($fp,$id);
fwrite($fp,"\n");
fwrite($fp,$pass);
fclose($fp);
echo("id is $id, pass is $pass");
if(file_exists($fp)){
    if(sizeof($fp)>0){
        echo("id is $id, pass is $pass");
    }else{
        echo("file size is zero");
    }
}
?>

위 코드가 잘 반응하는지 웹에서 확인하기 위한 코드는 아래와 같다.
get 방식으로 테스트하려면,
http://radstyle.net/loginTest.php?id=aaaa&pass=1111 만으로 될 것이다.
(추가로 php 파일 업로드 폼도 작성해볼 것)

<?
echo("loginTest");

?>
<form action="loginTest.php" method="post" >
<input type=text name=id>
<input type=submit>
</form>


안드로이드 코드(파일첨부함):


package com.bbs.www;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class bbs extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  TextView resultField = ( TextView ) findViewById( R.id.result ) ;
  
  // try {
  // downloadUrl("http://radstyle.net/sexfa.php", "최원효");
  // } catch (UnsupportedEncodingException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // }
  try {
   resultField.setText(sendData("wono77", "하얀별"));
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
}
private String sendData(String id, String pwd)
   throws ClientProtocolException, IOException {
  // TODO Auto-generated method stub
  HttpPost request = makeHttpPost(id, pwd,
    "http://radstyle.net/loginTest.php");
  // Get 방식일경우
  // HttpPost request = makeHttpGet( id, pwd,
  // "http://www.shop-wiz.com/android_post.php" ) ;
  HttpClient client = new DefaultHttpClient();
  ResponseHandler<String> reshandler = new BasicResponseHandler();
  String result = client.execute(request, reshandler);
  return result;
}
// Post 방식일경우
private HttpPost makeHttpPost(String user_id, String user_pwd, String url) {
  // TODO Auto-generated method stub
  HttpPost post = new HttpPost(url);
  Vector<NameValuePair> params = new Vector<NameValuePair>();
  params.add(new BasicNameValuePair("id", user_id));
  params.add(new BasicNameValuePair("pass", user_pwd));
  post.setEntity(makeEntity(params));
  return post;
}

private HttpEntity makeEntity(Vector<NameValuePair> params) {
  HttpEntity result = null;
  try {
   //result = new UrlEncodedFormEntity( params ) ;
   result = new UrlEncodedFormEntity(params, HTTP.UTF_8);
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return result;
}

//다른 방식
private void downloadUrl(String postURL, String input)
   throws UnsupportedEncodingException {
  try {
   HttpClient client = new DefaultHttpClient();
   HttpPost post = new HttpPost(postURL);
   List<NameValuePair> params = new ArrayList<NameValuePair>();
   params.add(new BasicNameValuePair("name", input));
   UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,
     HTTP.UTF_8);
   post.setEntity(ent);
   HttpResponse responsePOST = client.execute(post);
   HttpEntity resEntity = responsePOST.getEntity();
  } catch (Exception e) {
   e.printStackTrace();
  }
}
}





* 남은 문제:

encoding UTF8을 하여 서버에 한글을 제대로 전송되었지만, 결과를 받아보니 한글이 깨졌음.
이 문제 해결을 위해서는 아래처럼 하면 된다고 한다.

참조:
http://www.androidpub.com/?_filter=search&mid=android_dev_qna&search_target=title_content&search_keyword=euc-kr&document_srl=549232

   text를 네트워크를 통해서 쓸 때 EUC-KR로 변환해서 쏘아주고,

   OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), "EUC-KR"));
   writer.write(text);

   받을때도 아래처럼...
      
   BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "EUC-KR")));
   String text = reader.readLine();

일반적으로 웹의 글을 가져올때는 테스트로 작성한 코드처럼 httpPost로 글을 가져오지 않고,
isStream으로 아래처럼 가져오므로, 이 때는 한글 변환에 문제가 없으리라 생각된다.
url에서 stream을 가져온후, post 방식으로 redirected된 url을 가져오던 소스의 bufferRead하던 부분과
조합해서 위의 인코딩을 잘 넣어보면 한글도 읽혀지지 않을까 싶다.
아래에서 싸이주소값을 가져올때는 한글이 깨졌었다.

/**
  * url에서 이미지를 가져와서 sdcard에 저장하는 함수
  * fullPath=urlPrefix + fileName
  *
  * @author wono77(2010.04.11)
  * @param urlPrefix : "http://radstyle.net/images/cp/"
  * @param fileName : a.jpg
  */
public void imageSaveFromURL(String urlPrefix, String fileName) {
  String fullImageUrl = urlPrefix + fileName;
  // String sdcardPath =
  // Environment.getExternalStorageDirectory().toString();//+ "/sdcard/";
  String sdcardFullPath = sdcardPath + fileName;
  // url을 파일에 저장
  InputStream is = null;
  try {
   is = getUrlStream(fullImageUrl);
  } catch (Exception e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  // directory 존재여부 체크 한번
  File dir = new File(sdcardPath);
  if (!dir.exists()) {
   dir.mkdir();
  }
  if (is != null) {
   try {
    BufferedInputStream bis = new BufferedInputStream(is);
    FileOutputStream fos = new FileOutputStream(new File(sdcardFullPath));
    int n = 0;
    try {
     while ((n = bis.read()) != -1) {
      fos.write(n);
     }
    } catch (IOException e) {
     Log.v("a", "write fail");
    } finally {
     fos.close();
     bis.close();
    }
   } catch (IOException e) {
    Log.v("a", "fail");
   }
  }
}

/**
  * url에서 inputStream을 받아오는 함수
  *
  * @author wono77(2010.04.11)
  * @param path
  * @return
  * @throws Exception
  */
public InputStream getUrlStream(String path) throws Exception {
  InputStream is = null;
  try {
   // 20100222 최원효 : timeout 셋팅
   int desiredValue = 3000;
   URL sourceImageUrl = new URL(path);
   URLConnection t_connection = sourceImageUrl.openConnection();
   t_connection.setConnectTimeout(desiredValue);
   t_connection.setReadTimeout(desiredValue);
   is = t_connection.getInputStream();
  } catch (Exception e) {
   if (is != null) {
    is.close();
   }
   is = null;
  }
  return is;
}

/**
  * url을 입력받아 direct 되는 url의 내용을 가져오는 함수
  *
  * @author wono77(2010.08.24)
  * @param inputUrl
  * @return
  * @throws IOException
  */
public String getRedirectedUrlStream(String inputUrl) {
  URL url = null;
  String inputLine = "";
  String response = "";
  URLConnection conn = null;
  try {
   url = new URL(inputUrl);
   conn = url.openConnection();
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  if (conn instanceof HttpURLConnection) {
   HttpURLConnection httpConn = (HttpURLConnection) conn;
   try {
    httpConn.setRequestMethod("POST");
    httpConn.setRequestProperty("Content-type", "text/xml");
    httpConn.setUseCaches(false);
    httpConn.setDoInput(true);
    httpConn.setDoOutput(true);
    String testxml = null;
    DataOutputStream out;
    out = new DataOutputStream(httpConn.getOutputStream());
    out.flush();
    out.close();
    // This next line throws an IOException if response code is not
    // 200 <<======<<
    BufferedReader in = null;
    in = new BufferedReader(new InputStreamReader(
      httpConn.getInputStream()));
    while ((inputLine = in.readLine()) != null) {
     response = response + inputLine;
    }
    in.close();
   } catch (ProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return response;
  } else {
   return null;
  }
}



* 더 해볼 내용: 이미지 업로드

참고할것 :
http://www.androidpub.com/?_filter=search&mid=android_dev_qna&search_target=title_content&search_keyword=post&page=4&division=-841993&last_division=-513271&document_srl=664496

* 참조한글:

1. 안드로이드 글쓰기 (외국글)
: http://blog.dahanne.net/2009/08/16/how-to-access-http-resources-from-android/
2. 안드로이드 이미지 업로드 with php
: http://blog.inculab.net/28
3. 초록돼지의 글 모음
: http://absenteye.blog.me/100110049502
4. 가장많이 참조한글
: http://www.shop-wiz.com/document/android/execise_linkage_web



[설명]
이번장에서는 웹과의 데이타 교환에 대해 연속적으로 다루어 보겠습니다.
그 첫번째로 post/get 방식으로 웹에 데이타를 전달하고 결과치를 다시 받는 것을 처리하겠습니다.
일단 어플에서 불러올 php 파일을 작성하겠습니다.
이 php파일은 변수를 받아서 출력해주는 프로그램입니다.
android_post.php
<?php  
$id = $_POST["user_id"] ;
$pwd = $_POST["user_pwd"] ;  
echo "your id is ".$id." and your passwd is ".$pwd;  
?>

[설명]
이제는 AndroidManifest.xml에서 인터넷에 대한 권한이 줍니다.
<uses-permission android:name="android.permission.INTERNET" />

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.ProjectLinkageWeb"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ProjectLinkageWeb"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
  
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

[설명]
그리고 main.xml 에서 두개의 입력박스와 하나의 출력박스, 그리고 버튼을 생성합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
<TextView    
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="Input Your Id"  
    />  
<EditText  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:id="@+id/user_id"  
/>  
<TextView    
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="Input Your password"  
    />  
<EditText  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:id="@+id/user_pwd"  
/>  
<TextView  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:id="@+id/get_result"  
    android:text="Result Field"  
/>  
<Button  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:id="@+id/submitBtn"  
    android:text="Submit"  
/>      
</LinearLayout>  

[설명]
그리고 아래처럼... 별도의 설명은 드리지 않겠습니다.
소스가 어렵지 않으니 눈으로 따라 보시면 될것입니다.

package com.ProjectLinkageWeb;
  
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Vector;
  
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
  
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
  
public class ProjectLinkageWeb extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
          
        Button button = (Button) findViewById( R.id.submitBtn ) ;  
        button.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                String user_id = ((EditText) findViewById(R.id.user_id)).getText().toString() ;  
                String user_pwd = ((EditText) findViewById(R.id.user_pwd)).getText().toString() ;  
                TextView resultField = ( TextView ) findViewById( R.id.get_result ) ;  
  
                try {  
                //데이터를 웹서버에 보내고 받아온 결과를 출력합니다.  
                    resultField.setText( sendData( user_id, user_pwd ) ) ;  
                } catch (ClientProtocolException e) {  
                // TODO Auto-generated catch block  
                    e.printStackTrace();  
                } catch (IOException e) {  
                // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
         });        
    }
      
    private String sendData(String id, String pwd) throws ClientProtocolException, IOException {  
        // TODO Auto-generated method stub  
        HttpPost request = makeHttpPost( id, pwd, "http://www.shop-wiz.com/android_post.php" ) ;  
        // Get 방식일경우
        //HttpPost request = makeHttpGet( id, pwd, "http://www.shop-wiz.com/android_post.php" ) ;
        HttpClient client = new DefaultHttpClient() ;  
        ResponseHandler<STRING> reshandler = new BasicResponseHandler() ;
        String result = client.execute( request, reshandler ) ;  
        return result ;  
    }  
  
    //Post 방식일경우
    private HttpPost makeHttpPost(String user_id, String user_pwd, String url) {  
        // TODO Auto-generated method stub  
        HttpPost request = new HttpPost( url ) ;  
        Vector<NAMEVALUEPAIR> nameValue = new Vector<NAMEVALUEPAIR>() ;  
        nameValue.add( new BasicNameValuePair( "user_id", user_id ) ) ;  
        nameValue.add( new BasicNameValuePair( "user_pwd", user_pwd ) ) ;  
        request.setEntity( makeEntity(nameValue) ) ;  
        return request ;  
    }  
      
    //Get 방식일경우
    private HttpGet makeHttpGet(String user_id, String user_pwd, String url) {  
        // TODO Auto-generated method stub  
        Vector<NAMEVALUEPAIR> nameValue = new Vector<NAMEVALUEPAIR>() ;  
        nameValue.add( new BasicNameValuePair( "user_id", user_id ) ) ;  
        nameValue.add( new BasicNameValuePair( "user_pwd", user_pwd ) ) ;
            
        String my_url = url + "?" + URLEncodedUtils.format( nameValue, null) ;  
        HttpGet request = new HttpGet( my_url ) ;  
        return request ;  
    }
      
    private HttpEntity makeEntity( Vector<NAMEVALUEPAIR> nameValue ) {  
        HttpEntity result = null ;  
        try {  
        result = new UrlEncodedFormEntity( nameValue ) ;  
        } catch (UnsupportedEncodingException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
        }  
        return result ;  
    }    
}
  
이 프로그램을 실행할때는 반드시 이클립스상에서 인터넷이 되는지 확인해야 합니다.



추천추천 : 1179 추천 목록
번호 제목
1,333
 오류난 폴더 강제삭제 방법
1,332
 크롬에서 플래시 항상 허용하도록 설정하기 (레지스트리) reg 파일 만들기
1,331
 GPT 디스크를 MBR 디스크로 변환
1,330
 MBR 디스크를 GPT 디스크로 변환
1,329
 구글 검색을 200% 활용하게 해주는 검색 명령어 총정리
1,328
 [Jquery] jQuery로 우클릭 방지, 드래그 방지, 선택 방지 (IE10, 파이어폭스, 크롬 확인)
1,327
 php 사용자 접속IP, 브라우저정보, os정보, http, https 접속프로토콜 알아오기
1,326
 [PHP] IE 브라우저 접속 검출하기
1,325
 윈도우10 시스템 예약 파티션 확인 및 삭제
1,324
 윈도우10 복구 파티션 삭제 방법
1,323
 윈도우10 부팅지연 검은화면에서 몇분간 머무는 현상 해결방법
1,322
 삼성노트북 바이오스 진입이 불가능한 경우 바이오스 재설치와 NVRAM 초기화
1,321
 익스플로러(IE)의 구글 검색공급자 한글로 변경 방법
1,320
 윈도우 10 기본 앱 삭제 및 복구
1,319
 meta 태그 http-equiv 설정방법과 차이점
1,318
 구글(Google)검색에서 고급연산자를 이용하여 많은 정보를 얻는 방법
1,317
 프로그램 없이 하드디스크 복사 및 백업하기
1,316
 Windows7 업데이트 기록 삭제방법
1,315
 포토샵 psd 파일 연결 레지스트리(registry) 편집
1,314
 윈도 10 최신 업데이트 후 인터넷 속도의 저하가 발생할 때 조치 사항
1,313
 Autotuning level 해제 (윈도우비스타 이상 윈도우)인터넷 속도 빠르게 하는 방법
1,312
 윈도우에서 특정프로세스를 일괄 종료하는법
1,311
 MediaPlayer 클래스 사용법
1,310
 안드로이드에서 audio player 실행하기
1,309
 [Android] MediaPlayer 음악재생기 만들기
목록
추억의가요방
인기절정뽕짝파티
인기트로트모음
지루박디스코메들리
밤무대애창곡
전자올겐경음악
세월따라노래따라
가슴시린트로트
7080추억속으로
CDN 추천곡
종합성인가요방
못잊을옛날노래
카바레 음악
트롯디스코팡팡
관광 메들리
트롯카페
가요감상실
추억의옛노래
스페셜가요광장
BillBoard Free
추천가요모음
경음악.전자올겐
스페셜음악여행
WOLRD POPs
K-POP\BillBoard
POP TOP BEST

최신인기가요특집
추천가요\인기
F뮤직 인기\발라드
F뮤직 애창\트로트
트로트성인가요
인기가요
프리미엄 POP
경음악\기타
프리미엄 최신가요
프리미엄 성인가요
뮤직트로트 부산광역시부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.