메뉴 건너뛰기

조회 수 9917 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

일기형태로 반말할꼐요^^;;;죄송합니다.

 

흠,, 원래는 sqlite를 써서 데이터 넣놨다가 꺼내써야되는데 ,,, 어쩌리오,,쓰는법도 복잡한걸,,,그냥 호스팅 받은 서버가 있어서 그냥 내가 ftp 만들어서 그것으로 쓰기로 마음먹었다. 그래서 일단 나스스로 ftp 서버만들고 실행해 보아야겠다.

첫번째 

ftp관련되어 찾아보니 2개의 클래스가 나오는데 그것은

com.oroinc.net.ftp;이것과 

com.apache.commons.net.ftp; 이렇게 2종류가 있었다 .고생고생하면서 2개 다해봤지만 2개 다안되었다... 그런데 그후에 문제해결한 후에는 2개 다 되네,, ,별차이없는것같다 다만 쓸때 그냥 라이브러리에 담기만 하면안된다. 절차를 따져서 하도록 하자.

일단절차는 scotthan.tistory.com/152 라는 능력자분께서 설명을 잘해놨네,,,혹시여기서 안되면

neouser.tistory.com/204에서 패스설정법을 마스터하여 패스를 설정하도록하자!!그러면 이제 소스를 보도록 하자. 나는 쓸대 없는 패스설정에서 너무 오래걸렸다ㅜㅜ자카르타가 영화인줄만 알았는데,,, 이런데서도 이름이 쓰이네,, 아무튼 꼭꼭!! 라이브러리만넣으면안된다!!

 

너무 많은 도움을주신 안사의 운영자이신 카이로님 매번 책에대해 1000번씩 감사하고잇습니다.

그리고 이번에 거의 60퍼이상을 참조한,,cafe.naver.com/iwillgosu/609 능력자님감사합니다. 이분에게서 ftp접속및 로그인과정을 참조하였습니다.

그리고 나머지 20을 참조한 jin32.tistory.com/2 님감사합니다. 이분한테 다운로드하는 소스참조하였습니다. 능력자 분들의 능력 존중하여 어설프게 안바꾸고 그대로가겠습니다.

 

일단 main layout은 그냥 TextView에 아이디하나만 치면된다. 잘다운받앗나 확인해야되니까. 그래서나의 layout id는 ftpser이다. 그냥 치기귀찬아서,,,영어도 몬하고,,,

 

그리고 가장중요한건 역시나 permission 이번에는 여기서 시간을 많이투자않해서 기분이좋다.

능력자님들 감사합니다. 덕분에이건 가볍게 패스합니다.

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

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

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

 

퍼미션이안되면 아무것도안되니 주의하고 또해야겠다.

 

package com.example.ftpgogo;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

//중요한부분이다 이부분으로 사용하는데 아래와 같이 다른 클래스를 써주어도 무방하다.

import com.oroinc.net.ftp.FTPClient;

import com.oroinc.net.ftp.FTPFile;

//import org.apache.commons.net.ftp.FTPClient;

//import org.apache.commons.net.ftp.FTPFile;

//아직 많은기능을안써서 그런지 아직은 두개의 차이가없다;;나는 oroinc으로 써야지 안되면 다른걸로 바꾸고,,,,

 

 

import android.os.Bundle;

import android.os.StrictMode;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.app.AlertDialog;

import android.view.Menu;

import android.widget.TextView;

import android.widget.Toast;

 

/*좋지 않은로직이다 원래 안드로이드는 ui쓰레드랑 겹치면 안되는데 지금테스트용으로 사용하다 보니 ㅜㅜ자꾸 런타임오류나길레 ㅠㅠ이부분에서도 시간엄청할애하다가 참조 분 사이트가없어졌네 ㅜㅜ죄송합니다. 아무튼 이전버전처럼 호환할수있는 로직을 주셔서 참조해서 풀었다. */

@SuppressLint("NewApi")


public class FTPGoGo extends Activity{

private FTPClient mFtp;

//내가 다운받은것을 이부분에 넣을것이다!!

private String DIR="/data/data/com.example.ftpgogo/files/";


TextView text;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_ftpgogo_go);

//위에 SuppressLint가없으면 이부분은 실행되지 않는다. 이것으로 인해ui쓰레드안에서도 쓰레드가 실행될 수있도록 뒷버전으로 돌린다. 근데 이건 잘쓰면안된다니 테스트용으로만 사용하도록하자

StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

 

text=(TextView)findViewById(R.id.ftpser);

 

getFileFromFTP();

}

//이부분에서 FTP연결과 데이터를 가져오는 주요기능을 담당한다. 

public void getFileFromFTP(){

//먼저 접속하는 로직이다. 

if(!FTPConnect("내가접속할 호스트주소")){

msgBox("FTP 연결실패!!");

return; 

}

//로그인을하자

if(!FTPLogin("나의서버아이디","패스워드")){

msgBox("FTP로그인 실패");

FTPClose();

return;

}

//오늘의 핵심 파일가져오기 

if(!FTPGetFile()){

msgBox("FTP GetFile 실패!!");

FTPClose();

return;

}

msgBox("FTP파일 다운로드 성공!!");

}

//이부분이 연결하는 로직인데 쓰레드를 조심하다 위에서 말한걸안해주면 메인쓰레드랑겹치게되어connect가안된다.

 

public boolean FTPConnect(String host){

try{//눈물나는 부분이다 첫번째줄은 패스를못잡고, 두번째 부분은 호환성때문에 너무오랜시간이 걸렸다..ㅜ 고작두줄이나를 이렇게힘들게 ,,, ㅜㅜ

mFtp=new FTPClient();

mFtp.connect(host,21);

}catch(IOException e){

return false;

}

return true;

}

//ftp 로그인도 해주자!!

public boolean FTPLogin(String Id,String Pw){

try{

if(!mFtp.login(Id,Pw))

return false;

}catch(IOException e){

return false;

}

return true;

}

//이제 ftp를 닫아주자

public boolean FTPClose(){

try{

mFtp.disconnect();

}catch(IOException e){

return false;

}

return true;

}

//ftp에서 파일을 가져오는 부분이다 너무나도 중요하다!!

public boolean FTPGetFile(){

FileOutputStream os;

File f;

 

try{//일단 ftp상의 경로를 먼저정해주자 

mFtp.changeWorkingDirectory("이것은 ftp상의 폴더경로를지정하는것이다");

//후에 거기에있는파일들을 모조리가져오자

FTPFile files[]=mFtp.listFiles();

//궁금해서 젤첨에가져오는게뭔지 확인해보려고 썻다. 역시 순서대로가져온다;;

msgBox(files.length+files[0].getName());

//모든파일들을 이제가져오자

for(int i=0;i<files.length;i++){

//나는특정xml을원해서 그것을 가져오는데 다른게필요하면 로직을써주면되겠다.나는 하나만가져올꺼당.

if(files[i].getName().equals("data.xml")){

//DIR은 내폰의 경로이다.없으면데이터만들고

f=new File(DIR+files[i].getName());

//이부분은 스트림이다.

os=new FileOutputStream(f);

//이부분은 ftp에서 가져온파일을 스트림에 쓴다.

mFtp.retrieveFile(files[i].getName(),os);

//성공을만끽하며토스트띄우자

Toast.makeText(this,DIR+files[i].getName()+
"을저장했다",Toast.LENGTH_SHORT).show();

//스트림닫아주자

os.close();

//이제가져온파일이맞는지 뷰에쓰도록하자

text.setText(showText(files[i].getName()));

}

}

}catch(IOException e){

msgBox(e.toString());

return false;

}

return true;

}
//이건 전능력자분이 쓰신건데 디버그할때 너무나도 좋다.나도 자주써야지

public msgBox(String msg){

AlertDialog.Builder bld=new AlertDialog.Builder(FTPGoGo.this);

bld.setTitle("message");

bld.setMessage(msg);

bld.setPositiveButton("닫기",null);

bld.show();

}

//이건 내가가져온파일 내용 가져오기 나중에 파싱할꺼니까.

public String showText(String fileName) throws IOException{

File ff=new File("/data/data/com.example.fileiotest/files/"+filename);

BufferedReader br;

StringBuffer sb=new StringBuffer();

br=new BufferedReader(new InputStreamReader(openFileInput(filename));

String str=null;

while((str=br.readLine())!=null){

sb.append(str+"\n");

}

return sb.toString();

}

}

이구 ㅜㅜ 연습하려고 직접 다쳤는데 시간이너무오래걸리네 ㅜㅜ나중에는 복사해야겠다.. 

혹시나 참고하시는분 오타있더라도 이해좀요 ㅜㅜ 업로드는 더멋지게해볼꼐요 .

이상 열정남이었습니다.

 


하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved